From 7a7b559723e20de635d3888ea58eb151993c2ca2 Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com>
Date: 星期二, 16 十二月 2025 17:39:56 +0800
Subject: [PATCH] 1

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db     |    0 
 项目代码/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_copy.js                                           |  105 ++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj                                         |    8 
 项目代码/WIDESEA_WMSClient/src/api/http.js                                                                      |    3 
 项目代码/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue                                              |  465 ++--------
 项目代码/WIDESEA_WMSClient/src/views/Login.vue                                                                  |   95 -
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj                                                 |   47 +
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-shm      |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db          |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-wal |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/Level.cs                                                      |   16 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer.sln                                                        |   14 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/ILogFactory.cs                                                |    7 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-wal      |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Properties/AssemblyInfo.cs                                        |   36 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/Log.cs                                                        |  755 +++++++++++++++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundController.cs                   |   32 
 项目代码/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue                                                   |   65 -
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/LogFactory.cs                                                 |   11 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs                                     |  195 ++++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/FileUtil.cs                                                   |   39 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs                                     |  215 +++++
 项目代码/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js                                                |  235 ----
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/GroupPalletDto.cs                                        |   23 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/ILog.cs                                                       |   89 ++
 项目代码/WMS无仓储版/WIDESEA_WMSServer/LogLibrary/Log/LogUtil.cs                                                    |   57 +
 项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-shm |    0 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs                                   |    8 
 28 files changed, 1,849 insertions(+), 671 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/api/http.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/api/http.js"
index 4418d76..f61383c 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/api/http.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/api/http.js"
@@ -13,7 +13,8 @@
 let loadingInstance;
 let loadingStatus = false;
 if (process.env.NODE_ENV == 'development') {
-    axios.defaults.baseURL = window.webConfig.webApiBaseUrl;
+    axios.defaults.baseURL = 'http://127.0.0.1:9291/';
+    // axios.defaults.baseURL = window.webConfig.webApiBaseUrl;
 }
 else if (process.env.NODE_ENV == 'debug') {
     axios.defaults.baseURL = 'http://127.0.0.1:8098/';
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue"
index 61170fd..39cbe94 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/extend/Pallet.vue"
@@ -1,12 +1,11 @@
 <template>
-  <vol-box v-model="groupPalletVisible" :title="'缁勭洏鎿嶄綔 - 鍗曟嵁鍙凤細' + currentDocNo" :height="1000" :width="1100" :padding="20"
-    :modal="true" @open="handleDialogOpen" @close="handleDialogClose">
+  <vol-box v-model="show" :title="'缁勭洏鎿嶄綔 - 鍗曟嵁鍙凤細' + orderNo" :height="1000" :width="1100" :padding="20" :modal="true">
     <div class="barcode-scanner-container">
 
       <!-- 浠撳簱閫夋嫨 - 绱у噾甯冨眬 -->
       <div class="location-section compact">
         <el-form :model="form" :rules="rules" ref="locationForm" class="compact-form">
-          <el-form-item label="浠撳簱" prop="warehouseType" class="location-select compact-item">
+          <el-form-item label="鍏ュ簱浠撳簱" prop="warehouseType" class="location-select compact-item">
             <el-select v-model="form.warehouseType" placeholder="璇烽�夋嫨浠撳簱" clearable filterable
               @change="handleWarehouseChange" style="width: 100%" :loading="warehouseLoading" size="medium">
               <el-option v-for="item in warehouseTypes" :key="item.warehouseType" :label="item.warehouseTypeDesc"
@@ -53,7 +52,7 @@
 
           <!-- 鎵樼洏鏉$爜杈撳叆 -->
           <div class="input-wrapper custom-input-group compact-input">
-            <div class="input-label">鏂欑鐮�</div>
+            <div class="input-label">鎵樼洏鏉$爜</div>
             <el-input ref="trayInput" v-model="trayBarcode" placeholder="璇锋壂鎻忔垨杈撳叆鏂欑鐮佸悗鎸夊洖杞﹂敭" clearable
               :disabled="!form.locationType || !form.warehouseType" @keyup.enter.native="handleTraySubmit"
               @clear="handleTrayClear" @input="handleTrayInput" class="custom-input" size="medium">
@@ -113,9 +112,10 @@
             </span>
           </div>
 
-          
-          <div  class="table-container">
-            <el-table :data="unpalletMaterials" stripe style="width: 100%" height="100%" size="small" v-loading="unpalletBarcodesLoading">
+
+          <div class="table-container">
+            <el-table :data="unpalletMaterials" stripe style="width: 100%" height="100%" size="small"
+              v-loading="unpalletBarcodesLoading">
               <el-table-column type="index" label="搴忓彿" width="60" align="center"></el-table-column>
               <el-table-column prop="barcode" label="鏉$爜" min-width="140" show-overflow-tooltip></el-table-column>
               <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" min-width="150" show-overflow-tooltip></el-table-column>
@@ -126,7 +126,7 @@
             </el-table>
           </div>
         </el-card>
-        
+
       </div>
 
       <!-- 鐗╂枡鍒楄〃 - 鍥哄畾楂樺害甯︽粴鍔ㄦ潯 -->
@@ -166,35 +166,23 @@
         </el-card>
       </div>
     </div>
-
-    <!--      <div slot="footer" class="dialog-footer">
-      <el-button @click="handleCancel">鍙栨秷</el-button>
-      <el-button type="primary" @click="handleConfirm">纭</el-button>
-    </div> -->
+    <template #footer>
+      <el-button type="danger" size="small" @click="handleDialogClose()">鍏抽棴</el-button>
+    </template>
   </vol-box>
 </template>
 <script>
 import http from '@/api/http.js';
 import VolBox from '@/components/basic/VolBox.vue';
-import VolForm from '@/components/basic/VolForm.vue';
-import VolTable from '@/components/basic/VolTable.vue';
-import { ElLoading, ElMessage, ElMessageBox } from 'element-plus';
-import { ref, onMounted, onUnmounted } from 'vue'
-import InboundOrder from '../../../views/inbound/inboundOrder.vue';
-import { th } from 'element-plus/es/locales.mjs';
 
 export default {
-  name: 'BarcodeScanner',
-  components: { VolBox, VolForm, VolTable },
-  props: {
-    docNo: { type: String, required: true, default: '' },
-    visible: { type: Boolean, required: true, default: false }
-  },
-
+  components: { VolBox },
   data() {
     return {
+      show: false,
+      orderNo: "",
       palletVisible: this.visible,
-      trayBarcodeReg:/^[A-Z]\d{9}$/,
+      trayBarcodeReg: /^[A-Z]\d{9}$/,
       trayBarcode: '',
       barcode: '',
       materials: [],
@@ -203,7 +191,7 @@
       debugMode: false,
       currentFocus: 'warehouse',
 
-      unpalletBarcodes:[],
+      unpalletBarcodes: [],
       unpalletBarcodesLoading: false,
       unpalletMaterials: [], // 鏈粍鐩樿缁嗘暟鎹垪琛�
 
@@ -239,12 +227,12 @@
             trigger: 'change'
           }
         ],
-        trayBarcode:[
+        trayBarcode: [
           {
             pattern: this.trayBarcodeReg,
             message: '鎵樼洏鍙锋牸寮忛敊璇紙闇�涓�1涓ぇ鍐欏瓧姣�+9涓暟瀛楋紝濡侫000008024锛�',
             trigger: 'blur'
-         }
+          }
         ],
         warehouseType: [
           {
@@ -255,12 +243,8 @@
       }
     }
   },
+
   computed: {
-    groupPalletVisible: {
-      get() { return this.visible; },
-      set(newVal) { this.$emit('update:visible', newVal); }
-    },
-    currentDocNo() { return this.docNo; },
     // 褰撳墠閫夋嫨鐨勪粨搴撳悕绉�
     currentWarehouseName() {
       const warehouse = this.warehouseTypes.find(item => item.warehouseType === this.form.warehouseType);
@@ -282,9 +266,6 @@
         this.resetData();
         this.$nextTick(() => {
           setTimeout(() => {
-            // this.focusTrayInput();
-            this.initwarehouseTypes(); // 鍒濆鍖栦粨搴�
-            this.initLocationTypes(); // 鍒濆鍖栦粨搴撳尯鍩�
             this.fetchStockStatistics(); // 鍔犺浇缁熻鏁版嵁
             this.fetchUnpalletMaterialDetails();
           }, 300);
@@ -310,37 +291,27 @@
       }
     }
   },
-  'form.warehouseType'(newVal) {
-    if (newVal) {
-      this.form.locationType = null;
-    } else {
-      this.locationTypes = [];
-    }
-  },
-
   mounted() {
 
-    // 娣诲姞鍏ㄥ眬閿洏鐩戝惉
     document.addEventListener('keypress', this.handleKeyPress);
 
-    // 浣跨敤setTimeout纭繚DOM瀹屽叏娓叉煋鍚庡啀鑱氱劍
     setTimeout(() => {
-      // this.focusTrayInput();
       this.focusLocationSelect();
     }, 300);
   },
   beforeDestroy() {
-    // 娓呯悊浜嬩欢鐩戝惉
     document.removeEventListener('keypress', this.handleKeyPress);
     this.clearAllTimers();
   },
   methods: {
-    /**
-* 鑷畾涔変粨搴撳尯鍩熼獙璇�
-* 鍏佽鍊间负0锛屽洜涓�0鏄悎娉曠殑locationType
-*/
+    open() {
+      this.show = true;
+      this.initLocationTypes();
+      this.initwarehouseTypes();
+      this.fetchStockStatistics();
+      this.fetchUnpalletMaterialDetails();
+    },
     validateLocationType(rule, value, callback) {
-      // 妫�鏌ュ�兼槸鍚︿负null銆乽ndefined鎴栫┖瀛楃涓诧紝浣嗗厑璁告暟瀛�0
       if (!this.form.warehouseType) {
         callback(new Error('璇峰厛閫夋嫨浠撳簱'));
       } else if (value === null || value === undefined || value === '') {
@@ -349,32 +320,19 @@
         callback();
       }
     },
-    
+
     // 鏍规嵁鏉$爜鍒楄〃鑾峰彇璇︾粏鏁版嵁
     async fetchUnpalletMaterialDetails() {
       try {
-        // 灏濊瘯璋冪敤鎺ュ彛鑾峰彇璇︾粏鏁版嵁
-        // 娉ㄦ剰锛氬鏋滆繖涓帴鍙d笉瀛樺湪锛屽彲浠ユ敞閲婃帀鎴栨牴鎹疄闄匒PI璋冩暣
-        const response = await http.post('/api/InboundOrder/UnPalletGroupBarcode?orderNo='+this.docNo, {
-          
-        });
-
-        console.log('鏈粍鐩樻暟鎹�:', response.data);
-
-
+        const response = await http.post('/api/InboundOrder/UnPalletGroupBarcode?orderNo=' + this.docNo, {});
         if (response.status && Array.isArray(response.data)) {
           this.unpalletMaterials = response.data;
           this.unpalletBarcodes = response.data.map(item => item.barcode || '');
           this.totalStockCount = response.data.length;
         } else {
-          // 濡傛灉鎺ュ彛杩斿洖鏍煎紡涓嶅悓锛屽皾璇曞叾浠栨柟寮�
-          // 濡傛灉鎺ュ彛涓嶅瓨鍦紝杩欓噷浼氳繘鍏atch锛岃缃负绌烘暟缁�
           this.unpalletMaterials = [];
         }
       } catch (err) {
-        console.warn('鑾峰彇鏈粍鐩樿缁嗘暟鎹帴鍙e彲鑳戒笉瀛樺湪锛屼娇鐢ㄦ潯鐮佸垪琛ㄦ樉绀猴細', err);
-        // 濡傛灉鎺ュ彛涓嶅瓨鍦紝灏嗘潯鐮佸垪琛ㄨ浆鎹负绠�鍗曠殑鏄剧ず鏍煎紡
-        // 鎴栬�呬繚鎸佷负绌猴紝璁╃敤鎴风煡閬撻渶瑕侀�夋嫨浠撳簱鍜屽尯鍩熸潵鏌ョ湅璇︾粏鏁版嵁
         this.unpalletMaterials = this.unpalletBarcodes.map(barcode => ({
           barcode: barcode,
           materielCode: '-',
@@ -386,121 +344,21 @@
         }));
       }
     },
-    /**
-    * 鍒濆鍖栦粨搴撳尯鍩熸暟鎹�
-    */
     async initLocationTypes() {
-      this.locationLoading = true;
-      this.error = '';
-
       try {
-        const response = await http.post('/api/LocationInfo/GetLocationTypes');
-
-        if (response.status && Array.isArray(response.data)) {
-          this.locationTypes = response.data;
-          if (this.locationTypes.length === 0) {
-            this.error = '鏈幏鍙栧埌浠撳簱鍖哄煙鏁版嵁';
-          } else {
-            // 濡傛灉鏈夐粯璁ゅ尯鍩燂紝鍙互鍦ㄨ繖閲岃缃�
-            // this.form.locationType = this.locationTypes[0].locationType;
-          }
-        } else {
-          this.error = '鑾峰彇浠撳簱鍖哄煙鏁版嵁澶辫触';
-        }
-      } catch (error) {
-        console.error('鑾峰彇浠撳簱鍖哄煙澶辫触:', error);
-        this.error = `鑾峰彇浠撳簱鍖哄煙澶辫触: ${error.message || '缃戠粶閿欒'}`;
-      } finally {
-        this.locationLoading = false;
+        const { data } = await this.http.post("api/LocationInfo/GetLocationTypes")
+        this.locationTypes = data
+      } catch (e) {
+        this.$message.error('鑾峰彇鍖哄煙绫诲瀷澶辫触')
       }
     },
-
-    /**
-     * 鍒濆鍖栦粨搴撴暟鎹�
-     */
     async initwarehouseTypes() {
-      this.warehouseLoading = true;
-      this.error = '';
-
       try {
-        const response = await http.post('/api/Warehouse/GetwarehouseTypes');
-
-        if (response.status && Array.isArray(response.data)) {
-          this.warehouseTypes = response.data;
-          if (this.warehouseTypes.length === 0) {
-            this.error = '鏈幏鍙栧埌浠撳簱鏁版嵁';
-          } else {
-            // 濡傛灉鏈夐粯璁ゅ尯鍩燂紝鍙互鍦ㄨ繖閲岃缃�
-            // this.form.locationType = this.locationTypes[0].locationType;
-          }
-        } else {
-          this.error = '鑾峰彇浠撳簱鏁版嵁澶辫触';
-        }
-      } catch (error) {
-        console.error('鑾峰彇浠撳簱澶辫触:', error);
-        this.error = `鑾峰彇浠撳簱澶辫触: ${error.message || '缃戠粶閿欒'}`;
-      } finally {
-        this.warehouseLoading = false;
+        const { data } = await this.http.post("api/Warehouse/GetwarehouseTypes")
+        this.warehouseTypes = data
+      } catch (e) {
+        this.$message.error('鑾峰彇鍖哄煙绫诲瀷澶辫触')
       }
-    },
-
-
-    /**
-    * 浠撳簱鍖哄煙鍙樻洿澶勭悊
-    */
-    handleLocationChange(value) {
-      console.log('閫夋嫨浠撳簱鍖哄煙:', value, '绫诲瀷:', typeof value, this.currentLocationDesc);
-
-      // 绔嬪嵆娓呴櫎閿欒淇℃伅
-      this.error = '';
-
-      // 鎵嬪姩瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
-      this.$nextTick(() => {
-        if (this.$refs.locationForm) {
-          // 娓呴櫎璇ュ瓧娈电殑楠岃瘉鐘舵�侊紝鐒跺悗閲嶆柊楠岃瘉
-          this.$refs.locationForm.clearValidate('locationType');
-
-          // 鐭殏寤惰繜鍚庨噸鏂伴獙璇侊紝纭繚DOM宸叉洿鏂�
-          setTimeout(() => {
-            this.$refs.locationForm.validateField('locationType', (errorMsg) => {
-              if (!errorMsg && (value === 0 || value)) {
-                console.log('浠撳簱鍖哄煙楠岃瘉閫氳繃:', value);
-                // 鍖哄煙閫夋嫨鍚庯紝鑷姩鑱氱劍鍒版墭鐩樿緭鍏ユ
-                this.focusLocationSelect();
-                // 鍒锋柊鏈粍鐩樻暟鎹紙鏍规嵁閫夋嫨鐨勪粨搴撳拰鍖哄煙杩囨护锛�
-              }
-            });
-          }, 100);
-        }
-      });
-    },
-
-    /**
-     * 浠撳簱鍙樻洿澶勭悊
-     */
-    handleWarehouseChange(value) {
-      console.log('閫夋嫨浠撳簱:', value, '绫诲瀷:', typeof value, this.currentWarehouseName);
-
-      // 绔嬪嵆娓呴櫎閿欒淇℃伅
-      this.error = '';
-
-      // 鎵嬪姩瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
-      this.$nextTick(() => {
-        if (this.$refs.locationForm) {
-          // 娓呴櫎璇ュ瓧娈电殑楠岃瘉鐘舵�侊紝鐒跺悗閲嶆柊楠岃瘉
-          this.$refs.locationForm.clearValidate('warehouseType');
-
-          // 鐭殏寤惰繜鍚庨噸鏂伴獙璇侊紝纭繚DOM宸叉洿鏂�
-          setTimeout(() => {
-            this.$refs.locationForm.validateField('warehouseType', (errorMsg) => {
-              if (!errorMsg && (value === 0 || value)) {
-                console.log('浠撳簱楠岃瘉閫氳繃:', value);
-                this.focusLocationSelect();
-              }
-            });
-          }, 100);
-        }
-      });
     },
 
     async fetchStockStatistics() {
@@ -513,29 +371,21 @@
       this.sumLoading = true;
       this.sumError = '';
       try {
-        // 璋冪敤鍚庣缁熻鎺ュ彛锛堟浛鎹负浣犵殑瀹為檯鎺ュ彛璺緞锛�
-        const response = await http.post('/api/InboundOrder/UnPalletQuantity?orderNo=' + this.docNo, {
-
-        });
-
-        // 缁戝畾鏁版嵁锛堝尮閰� PalletSumQuantityDTO 缁撴瀯锛�
+        const response = await http.post('/api/InboundOrder/UnPalletQuantity?orderNo=' + this.docNo, {});
         if (response.data) {
-          this.totalStockSum = response.data.stockSumQuantity || 0; // 鎬诲簱瀛樻暟閲�
-          this.totalStockCount = response.data.stockCount || 0;     // 鎬诲簱瀛樿褰曟暟
-          this.uniqueUnit = response.data.uniqueUnit || '';               // 璁¢噺鍗曚綅
+          this.totalStockSum = response.data.stockSumQuantity || 0;
+          this.totalStockCount = response.data.stockCount || 0;
+          this.uniqueUnit = response.data.uniqueUnit || '';
         }
       } catch (err) {
         this.sumError = '缁熻鍔犺浇澶辫触';
         this.totalStockSum = 0;
         this.totalStockCount = 0;
-        console.error('搴撳瓨缁熻鏌ヨ寮傚父锛�', err);
       } finally {
         this.sumLoading = false;
       }
     },
-    /**
-     * 琛ㄥ崟楠岃瘉
-     */
+
     async validateForm() {
       return new Promise((resolve) => {
         if (!this.$refs.locationForm) {
@@ -550,40 +400,18 @@
             this.error = '';
             resolve(true);
           } else {
-            // 鎵嬪姩妫�鏌ocationType锛屾纭鐞嗗�间负0鐨勬儏鍐�
             if (!this.from.warehouseType) {
               this.error = '璇峰厛閫夋嫨浠撳簱';
             }
             else if (this.form.locationType === null || this.form.locationType === undefined || this.form.locationType === '') {
               this.error = '璇峰厛閫夋嫨浠撳簱鍖哄煙';
-              //this.$message.warning('璇峰厛閫夋嫨浠撳簱鍖哄煙');
             } else {
-              // 濡傛灉鍊煎瓨鍦紙鍖呮嫭0锛夛紝浣嗛獙璇佷笉閫氳繃锛屽彲鑳芥槸鍏朵粬楠岃瘉閿欒
               this.error = '璇锋鏌ヨ〃鍗曞~鍐欐槸鍚︽纭�';
             }
             resolve(false);
           }
         });
       });
-    },
-    focusWarehouseSelect() {
-      if (this.$refs.locationForm) {
-        const selectEl = this.$el.querySelector('.location-select:first-child .el-input__inner');
-        if (selectEl) {
-          selectEl.focus();
-          this.currentFocus = 'warehouse';
-        }
-      }
-    },
-    // 鑱氱劍鍒颁粨搴撳尯鍩熼�夋嫨
-    focusLocationSelect() {
-      if (this.$refs.locationForm) {
-        const selectEl = this.$el.querySelector('.location-select:nth-child(2) .el-input__inner');
-        if (selectEl) {
-          selectEl.focus();
-          this.currentFocus = 'location';
-        }
-      }
     },
     // 鑱氱劍鍒版墭鐩樿緭鍏ユ
     focusTrayInput() {
@@ -606,18 +434,10 @@
           inputEl.focus();
           this.currentFocus = 'material';
           this.scanTarget = 'material';
-          
-          
-            inputEl.select();
-            console.log('鐗╂枡杈撳叆妗嗗唴瀹瑰凡閫変腑');
-          
+          inputEl.select();
         }
       }
     },
-
-     
-    
-    
     // 閲嶇疆鎵�鏈夋暟鎹�
     resetData() {
       console.log('閲嶇疆寮规鏁版嵁');
@@ -664,38 +484,9 @@
         this.scanTimer = null;
       }
     },
-
-    // 寮规鎵撳紑鏃堕噸缃暟鎹�
-    handleDialogOpen() {
-      console.log('寮规鎵撳紑锛岄噸缃暟鎹�');
-      this.resetData();
-      // 浣跨敤setTimeout纭繚DOM瀹屽叏娓叉煋鍚庡啀鑱氱劍
-      this.$nextTick(() => {
-        setTimeout(() => {
-          this.initwarehouseTypes();
-          this.initLocationTypes(); // 鍒濆鍖栦粨搴撳尯鍩�
-          // 纭繚琛ㄥ崟寮曠敤瀛樺湪鍚庡啀鑱氱劍
-          if (this.$refs.locationForm) {
-            this.focusWarehouseSelect();
-          } else {
-            // 濡傛灉琛ㄥ崟寮曠敤杩樹笉瀛樺湪锛岀◢鍚庨噸璇�
-            setTimeout(() => {
-              this.focusWarehouseSelect();
-            }, 500);
-          }
-        }, 300);
-      });
-    },
-
-    // 寮规鍏抽棴鏃堕噸缃暟鎹�
     handleDialogClose() {
-      console.log('寮规鍏抽棴锛岄噸缃暟鎹�');
+      this.show = false;
       this.resetData();
-    },
-
-    // 鍙栨秷鎸夐挳
-    handleCancel() {
-      this.palletVisible = false;
     },
 
     // 纭鎸夐挳
@@ -785,12 +576,13 @@
 
       this.error = '';
 
-      if(!this.trayBarcodeReg.test(currentTrayBarcode)){
-        ElMessage.warning({
-          message: '鎵樼洏鍙锋牸寮忛敊璇�',
-          type: 'warning',
-          duration: 3000
-        })
+      if (!this.trayBarcodeReg.test(currentTrayBarcode)) {
+        // ElMessage.warning({
+        //   message: '鎵樼洏鍙锋牸寮忛敊璇�',
+        //   type: 'warning',
+        //   duration: 3000
+        // })
+        this.$message("鎵樼洏鍙锋牸寮忛敊璇�");
         this.focusTrayInput();
         return;
       }
@@ -798,11 +590,12 @@
       // 璁剧疆鎵樼洏鏉$爜鍚庯紝鑷姩鑱氱劍鍒扮墿鏂欒緭鍏ユ
       this.focusBarcodeInput();
 
-      this.$message({
-        message: `鎵樼洏鏉$爜宸茶缃�: ${currentTrayBarcode}`,
-        type: 'success',
-        duration: 2000
-      });
+      // this.$message({
+      //   message: `鎵樼洏鏉$爜宸茶缃�: ${currentTrayBarcode}`,
+      //   type: 'success',
+      //   duration: 2000
+      // });
+      this.$message.success(`鎵樼洏鏉$爜宸茶缃�: ${currentTrayBarcode}`);
     },
 
     // 娓呴櫎鎵樼洏
@@ -829,7 +622,7 @@
       this.isManualInput = false;
       this.isScanning = false;
     },
-    
+
 
     // 澶勭悊鐗╂枡鏉$爜鎻愪氦
     async handleBarcodeSubmit() {
@@ -851,71 +644,43 @@
       this.error = '';
       this.loading = true;
 
+      console.log(currentBarcode);
       try {
         // 璋冪敤API鏌ヨ鐗╂枡淇℃伅
         const materialData = await this.fetchMaterialData(currentBarcode);
         if (!materialData || materialData.length === 0) {
-
-
           return;
         }
-        // 妫�鏌ユ槸鍚﹀凡瀛樺湪鐩稿悓鐗╂枡缂栫爜鐨勮褰�
-        const exists = this.materials.some(item =>
-          item.barcode === this.trayBarcode
-        );
-        console.log('API:', materialData)
-        if (exists) {
-          this.$message({
-            message: '璇ユ潯鐮佸凡瀛樺湪褰撳墠鎵樼洏鐨勫垪琛ㄤ腑',
-            type: 'warning',
-            duration: 2000
+
+        this.materials = [];
+        materialData.forEach(item => {
+          this.materials.push({
+            ...item,
+            trayCode: this.trayBarcode,
+            locationType: this.form.locationType,
+            locationDesc: this.currentLocationDesc,
+            scanTime: this.formatTime(new Date())
           });
-          
-        } else {
+        });
+        this.orderNo = materialData[0].orderNo;
 
-          materialData.forEach(item => {
+        this.fetchStockStatistics();
+        // 娓呯┖鐗╂枡杈撳叆妗嗗苟淇濇寔鑱氱劍
+        this.barcode = '';
+        this.scanCode = ''; // 娓呯┖鎵爜缂撳瓨
+        this.isScanning = false;
 
-            // 濡傛灉涓嶅瓨鍦紝娣诲姞鏂扮墿鏂�
-            this.materials.push({
-              ...item,
-              trayCode: this.trayBarcode,
-              locationType: this.form.locationType,
-              locationDesc: this.currentLocationDesc,
-              scanTime: this.formatTime(new Date())
-            });
-          });
-          
-          const removeIndex = this.unpalletMaterials.findIndex(item => item.barcode === currentBarcode);
-          if (removeIndex > -1) {
-            this.unpalletMaterials.splice(removeIndex, 1); // 鍒犻櫎鏈粍鐩樺搴旀暟鎹�
-            this.unpalletBarcodes = this.unpalletMaterials.map(item => item.barcode || ''); // 鏇存柊鏉$爜鏁扮粍 
-            this.totalStockCount = Math.max(0, this.totalStockCount - 1);
-          }
-
-          this.$message({
-            message: `鎴愬姛娣诲姞鏉$爜: ${currentBarcode}`,
-            type: 'success',
-            duration: 2000
-          });
-
-          this.fetchStockStatistics();
-          // 娓呯┖鐗╂枡杈撳叆妗嗗苟淇濇寔鑱氱劍
-          this.barcode = '';
-          this.scanCode = ''; // 娓呯┖鎵爜缂撳瓨
-          this.isScanning = false;
-
-          setTimeout(() => {
-            this.focusBarcodeInput();
-          }, 100);
-        }
+        setTimeout(() => {
+          this.focusBarcodeInput();
+        }, 100);
       } catch (err) {
         this.error = err.message || '鏌ヨ鏉$爜淇℃伅澶辫触锛岃閲嶈瘯';
         this.focusBarcodeInput();
         setTimeout(() => {
-      // 閫変腑杈撳叆妗嗗唴鐨勯敊璇唴瀹癸紙纭繚focus瀹屾垚鍚庢墽琛岋級
-      const inputEl = this.$refs.barcodeInput?.$el?.querySelector('input');
-      if (inputEl) inputEl.select();
-    }, 100);
+          // 閫変腑杈撳叆妗嗗唴鐨勯敊璇唴瀹癸紙纭繚focus瀹屾垚鍚庢墽琛岋級
+          const inputEl = this.$refs.barcodeInput?.$el?.querySelector('input');
+          if (inputEl) inputEl.select();
+        }, 100);
       } finally {
         this.loading = false;
       }
@@ -924,18 +689,15 @@
     // API璇锋眰 - 鏇挎崲涓哄疄闄呯殑API璋冪敤
     async fetchMaterialData(barcode) {
       try {
-        const response = await http.post('/api/InboundOrder/BarcodeMaterielGroup',
+        const response = await http.post('/api/Inbound/GroupPallet',
           {
             palletCode: this.trayBarcode,
-            orderNo: this.docNo,
-            barcodes: barcode,
+            barcode: barcode,
             locationTypeDesc: this.currentLocationDesc,
             locationType: this.form.locationType, // 娣诲姞浠撳簱鍖哄煙淇℃伅
             warehouseType: this.form.warehouseType
           }
         );
-
-
         let materialData;
 
         if (typeof response.data === 'string') {
@@ -946,7 +708,6 @@
 
           }
         } else {
-          // 濡傛灉杩斿洖鐨勬槸JSON瀵硅薄锛岀洿鎺ヤ娇鐢�
           materialData = response.data;
         }
         if (!response.status) {
@@ -957,8 +718,6 @@
 
       } catch (error) {
         console.error('API璋冪敤澶辫触:', error);
-
-
       }
     },
 
@@ -1377,35 +1136,35 @@
   }
 
   .unpallet-section.compact {
-  margin-bottom: 8px;
-  flex-shrink: 0;
-}
-
-.unpallet-card {
-  flex-shrink: 0;
-}
-
-.unpallet-barcode-list {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 6px;
-  padding: 8px 0;
-  max-height: 180px;
-  overflow-y: auto;
-}
-
-.unpallet-barcode-list>>>.el-tag {
-  cursor: pointer;
-  max-width: calc(33.333% - 4px);
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-@media (max-width: 768px) {
-  .unpallet-barcode-list>>>.el-tag {
-    max-width: calc(50% - 4px);
+    margin-bottom: 8px;
+    flex-shrink: 0;
   }
-}
+
+  .unpallet-card {
+    flex-shrink: 0;
+  }
+
+  .unpallet-barcode-list {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 6px;
+    padding: 8px 0;
+    max-height: 180px;
+    overflow-y: auto;
+  }
+
+  .unpallet-barcode-list>>>.el-tag {
+    cursor: pointer;
+    max-width: calc(33.333% - 4px);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  @media (max-width: 768px) {
+    .unpallet-barcode-list>>>.el-tag {
+      max-width: calc(50% - 4px);
+    }
+  }
 }
 </style>
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
index 335d0cf..108a17e 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
@@ -1,13 +1,11 @@
 //姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-import http from '@/api/http.js'
-import { h, createVNode, render, reactive, ref } from 'vue';
-import { ElDialog, ElForm, ElFormItem, ElInput, ElButton, ElMessage, ElSelect, ElOption } from 'element-plus'; // 寮曞叆ElMessage锛岃В鍐虫彁绀烘棤鍙嶅簲
 import gridHeader from './extend/EmptyTrayInbound.vue'
+import gridBody from '../inbound/extend/Pallet.vue'
 let extension = {
   components: {
     //鏌ヨ鐣岄潰鎵╁睍缁勪欢
     gridHeader: gridHeader,
-    gridBody: '',
+    gridBody: gridBody,
     gridFooter: '',
     //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
     modelHeader: '',
@@ -17,32 +15,30 @@
   tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
   buttons: {
     view: [
-      {
-        name: '缁勭洏',
-        type: 'primary',
-        value: '缁勭洏',
-        onClick: function () { // 淇1锛氱Щ闄ゆ棤鐢╮ow鍙傛暟锛屽姞鏃ュ織璋冭瘯
-          console.log('缁勭洏鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
-          const selectedRows = this.$refs.table.getSelected();
+      // {
+      //   name: '缁勭洏',
+      //   type: 'primary',
+      //   value: '缁勭洏',
+      //   onClick: function () { // 淇1锛氱Щ闄ゆ棤鐢╮ow鍙傛暟锛屽姞鏃ュ織璋冭瘯
+      //     const selectedRows = this.$refs.table.getSelected();
+      //     // 鏍¢獙1锛氭槸鍚﹂�変腑琛�
+      //     if (selectedRows.length === 0) {
+      //       console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
+      //       ElMessage.warning('璇烽�夋嫨涓�鏉″崟鎹�');
+      //       return;
+      //     }
+      //     // 鏍¢獙2锛氭槸鍚﹂�変腑鍗曡
+      //     if (selectedRows.length > 1) {
+      //       console.log('鏍¢獙涓嶉�氳繃锛氶�変腑澶氳鍗曟嵁');
+      //       ElMessage.warning('鍙兘閫夋嫨涓�鏉″崟鎹�');
+      //       return;
+      //     }
 
-          // 鏍¢獙1锛氭槸鍚﹂�変腑琛�
-          if (selectedRows.length === 0) {
-            console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
-            ElMessage.warning('璇烽�夋嫨涓�鏉″崟鎹�');
-            return;
-          }
-          // 鏍¢獙2锛氭槸鍚﹂�変腑鍗曡
-          if (selectedRows.length > 1) {
-            console.log('鏍¢獙涓嶉�氳繃锛氶�変腑澶氳鍗曟嵁');
-            ElMessage.warning('鍙兘閫夋嫨涓�鏉″崟鎹�');
-            return;
-          }
+      //     const targetRow = selectedRows[0];
 
-          const targetRow = selectedRows[0];
-
-          this.$emit('openPalletDialog', targetRow.inboundOrderNo);
-        }
-      },
+      //     this.$emit('openPalletDialog', targetRow.inboundOrderNo);
+      //   }
+      // },
       {
         name: '鎾ら攢缁勭洏',
         type: 'primary',
@@ -245,181 +241,6 @@
           }
         }
       },
-      // {
-      //   name: '绌烘墭鐩樺叆搴�',
-      //   type: 'primary',
-      //   value: '绌烘墭鐩樺叆搴�',
-
-      //   onClick: function () {
-      //     const mountNode = document.createElement('div');
-      //     document.body.appendChild(mountNode);
-
-      //     // 鍝嶅簲寮忚〃鍗曟暟鎹細鏂欑鐮侊紙蹇呭~锛屾壂鐮佹灙/鎵嬪姩杈撳叆锛�
-      //     const formData = reactive({
-      //       boxCode: '',
-      //       warehouseCode: ''
-      //     });
-
-      //     const warehouses = ref([]);
-      //     const isLoadingWarehouses = ref(false);
-
-      //     const getWarehouseList = async () => {
-      //       isLoadingWarehouses.value = true;
-      //       try {
-      //         const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes');
-      //         if (status && Array.isArray(data)) {
-      //           // 鏍煎紡鍖栦粨搴撻�夐」锛氶�傞厤ElSelect鐨刲abel-value鏍煎紡
-      //           warehouses.value = data.map(item => ({
-      //             label: item.locationTypeDesc,
-      //             value: item.locationType
-      //           }));
-      //         } else {
-      //           ElMessage.error('鑾峰彇鍖哄煙鍒楄〃澶辫触');
-      //           warehouses.value = [];
-      //         }
-      //       } catch (err) {
-      //         ElMessage.error('鍖哄煙鏁版嵁璇锋眰寮傚父锛岃绋嶅悗閲嶈瘯');
-      //         warehouses.value = [];
-      //       } finally {
-      //         isLoadingWarehouses.value = false;
-      //       }
-      //     };
-
-      //     // 鎻愪氦琛ㄥ崟鐨勭粺涓�閫昏緫锛堜緵鍥炶溅瑙﹀彂鍜屾寜閽偣鍑诲叡鐢級
-      //     const submitForm = async () => {
-      //       const formRef = vnode.component.refs.batchInForm;
-      //       try {
-      //         // 鎵ц琛ㄥ崟鏍¢獙锛堟枡绠辩爜蹇呭~锛�
-      //         await formRef.validate();
-      //       } catch (err) {
-      //         ElMessage.warning('璇疯緭鍏ユ湁鏁堢殑鏂欑鐮�');
-      //         return;
-      //       }
-
-
-      //       http.post('/api/InboundOrder/EmptyMaterielGroup', {
-      //         palletCode: formData.boxCode.trim(),
-      //         warehouseCode: formData.warehouseCode
-      //       }).then(({ data, status, message }) => {
-      //         if (status) {
-      //           ElMessage.success(`鍏ュ簱鎴愬姛锛屾枡绠辩爜锛�${formData.boxCode.trim()}`);
-      //           this.refresh();
-      //           formData.boxCode = '';
-
-      //           setTimeout(() => {
-      //             const inputRef = vnode.component.refs.boxCodeInput;
-      //             inputRef?.focus();
-      //           }, 100);
-      //         } else {
-      //           ElMessage.error(message || data?.message || '鍏ュ簱澶辫触');
-      //           selectBoxCodeInput();
-      //         }
-      //       }).catch(() => {
-      //         ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
-      //         selectBoxCodeInput();
-      //       });
-      //     };
-
-      //     const selectBoxCodeInput = () => {
-      //       setTimeout(() => {
-      //         const inputRef = vnode.component.refs.boxCodeInput;
-      //         if (inputRef) {
-      //           const targetInput = inputRef.$el?.querySelector('input') || inputRef;
-      //           targetInput?.focus();
-      //           targetInput?.select();
-      //         }
-      //       }, 100);
-      //     }
-      //     const vnode = createVNode(ElDialog, {
-      //       title: '绌烘墭鐩樺叆搴�',
-      //       width: '400px',
-      //       modelValue: true,
-      //       appendToBody: true,
-
-      //       onOpened: async () => {
-      //         await getWarehouseList();
-      //         const inputRef = vnode.component.refs.boxCodeInput;
-      //         inputRef?.focus();
-      //       },
-      //       'onUpdate:modelValue': (isVisible) => {
-      //         if (!isVisible) {
-      //           render(null, mountNode);
-      //           document.body.removeChild(mountNode);
-      //         }
-      //       }
-      //     }, {
-      //       default: () => h(ElForm, {
-      //         model: formData,
-      //         rules: {
-      //           boxCode: [
-      //             { required: true, message: '璇疯緭鍏ユ枡绠辩爜', trigger: ['blur', 'enter'] }
-      //           ],
-      //           warehouseCode: [
-      //             { required: true, message: '璇烽�夋嫨鍖哄煙', trigger: ['change', 'blur'] }
-      //           ]
-      //         },
-      //         ref: 'batchInForm'
-      //       }, [
-      //         //浠撳簱鏁版嵁
-      //         h(ElFormItem, { label: '鍖哄煙', prop: 'warehouseCode', required: true }, [
-      //           h(ElSelect, {
-      //             modelValue: formData.warehouseCode,
-      //             'onUpdate:modelValue': (val) => {
-      //               formData.warehouseCode = val;
-      //             },
-      //             placeholder: '璇烽�夋嫨鍏ュ簱鍖哄煙',
-      //             filterable: true, // 鏀寔鎼滅储浠撳簱
-      //             loading: isLoadingWarehouses.value, // 鍔犺浇鐘舵��
-      //             style: { width: '100%' }
-      //           }, [
-      //             // 娓叉煋浠撳簱涓嬫媺閫夐」
-      //             warehouses.value.map(item => h(ElOption, {
-      //               label: item.label,
-      //               value: item.value
-      //             }))
-      //           ])
-      //         ]),
-      //         // 鏂欑鐮佽緭鍏ラ」锛堟敮鎸佽仛鐒︺�佸洖杞︽彁浜わ級
-      //         h(ElFormItem, { label: '鏂欑鐮�', prop: 'boxCode', required: true }, [
-      //           h(ElInput, {
-      //             type: 'text',
-      //             modelValue: formData.boxCode,
-      //             'onUpdate:modelValue': (val) => {
-      //               formData.boxCode = val;
-      //             },
-      //             ref: 'boxCodeInput',
-      //             placeholder: '鎵爜杈撳叆鎴栨墜鍔ㄨ緭鍏ユ枡绠辩爜',
-      //             // 鐩戝惉鍥炶溅浜嬩欢锛堟壂鐮佹灙榛樿浼氬彂閫佸洖杞︼級
-      //             onKeydown: (e) => {
-      //               if (e.key === 'Enter') {
-      //                 e.preventDefault();
-      //                 submitForm();
-      //               }
-      //             }
-      //           })
-      //         ]),
-      //         // 搴曢儴鎸夐挳鍖�
-      //         h('div', { style: { textAlign: 'right', marginTop: '16px' } }, [
-      //           h(ElButton, {
-      //             type: 'text',
-      //             onClick: () => {
-      //               render(null, mountNode);
-      //               document.body.removeChild(mountNode);
-      //               ElMessage.info('鍙栨秷鍏ュ簱浠诲姟');
-      //             }
-      //           }, '鍙栨秷'),
-      //           h(ElButton, {
-      //             type: 'primary',
-      //             onClick: submitForm
-      //           }, '纭畾')
-      //         ])
-      //       ])
-      //     });
-
-      //     vnode.appContext = this.$.appContext;
-      //     render(vnode, mountNode);
-      //   }
-      // }
     ], box: [], detail: []
   },
   methods: {
@@ -431,7 +252,13 @@
                this.$refs.gridHeader.open();
             }
         }
-
+        var GroupPalletBtn = this.buttons.find(x => x.value == "GroupPallet");
+        if (GroupPalletBtn != null) {
+          GroupPalletBtn.onClick = () => {
+              // console.log(this.$refs)
+               this.$refs.gridBody.open();
+            }
+        }
 
       this.columns.forEach(column => {
         if (column.field === 'orderStatistics') {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_copy.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_copy.js"
new file mode 100644
index 0000000..177fe52
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_copy.js"
@@ -0,0 +1,105 @@
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import gridHeader from './extend/EmptyTrayInbound.vue'
+import gridBody from './extend/Pallet.vue'
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: gridHeader,
+    gridBody: gridBody,
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, 
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      var EmptyTrayInboundBtn = this.buttons.find(x => x.value == "EmptyTrayInbound");
+        if (EmptyTrayInboundBtn != null) {
+          EmptyTrayInboundBtn.onClick = () => {
+               this.$refs.gridHeader.open();
+            }
+        }
+        var GroupPalletBtn = this.buttons.find(x => x.value == "GroupPallet");
+        if (GroupPalletBtn != null) {
+          GroupPalletBtn.onClick = () => {
+              // console.log(this.$refs)
+               this.$refs.gridBody.open();
+            }
+        }
+
+      this.columns.forEach(column => {
+        if (column.field === 'orderStatistics') {
+          column.formatter = (row) => {
+            // 鏍¢獙details鏄惁瀛樺湪涓旀湁鏁版嵁
+            if (row.details && row.details.length > 0) {
+              //鎸塵aterielCode鍒嗙粍缁熻orderQuantity鎬诲拰
+              const materielSumMap = row.details.reduce((acc, item) => {
+                const materielCode = item.materielCode || '鏈煡鐗╂枡';
+                const quantity = Number(item.orderQuantity) || 0;
+                acc[materielCode] = (acc[materielCode] || 0) + quantity;
+                return acc;
+              }, {});
+
+              //姣忎釜鐗╂枡椤圭敓鎴愮嫭绔媎iv锛岃法琛屾樉绀�
+              const displayItems = Object.entries(materielSumMap).map(([code, total]) => {
+                return `<div style="line-height: 1.5; white-space: normal;">${code}锛�${total}涓�</div>`;
+              });
+              const displayContent = displayItems.join('');
+              return `<div style="color: #F56C6C; white-space: normal; word-break: break-all;">${displayContent}</div>`;
+            } else {
+              return '<span style="color: #F56C6C">鏃犲叆搴撴槑缁�</span>';
+            }
+          };
+        }
+      });
+    },
+    onInited() {
+
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      // this.searchFormFields.orderType=[0]
+      let wheres = [{
+        'name': 'orderType',
+        'value': '0',
+        'displayType': 'text'
+      }];
+
+
+      param.wheres.push(...wheres);
+      return true;
+    },
+    searchAfter(result) {
+      return true;
+    },
+    addBefore(formData) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true;
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    }
+  }
+};
+export default extension;
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Login.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Login.vue"
index d810f15..99d69b8 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Login.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Login.vue"
@@ -13,63 +13,31 @@
         <div class="login-text-small">WELCOME TO LOGIN</div>
         <div class="item">
           <div class="input-icon el-icon-user"></div>
-          <input
-            type="text"
-            v-focus
-            v-model="userInfo.userName"
-            placeholder="璇疯緭鍏ヨ处鍙�"
-          />
+          <input type="text" v-focus v-model="userInfo.userName" placeholder="璇疯緭鍏ヨ处鍙�" />
         </div>
         <div class="item">
           <div class="input-icon el-icon-lock"></div>
-          <input
-            type="password"
-            v-focus
-            v-model="userInfo.password"
-            placeholder="璇疯緭鍏ュ瘑鐮�"
-          />
+          <input type="password" v-focus v-model="userInfo.password" placeholder="璇疯緭鍏ュ瘑鐮�" />
         </div>
 
-         <div class="item station-select-item">
+        <div class="item station-select-item">
           <div class="input-icon el-icon-lock"></div>
-          <el-select
-            v-model="stationValue"
-            placeholder="閫夋嫨绔欏彴"
-            class="station-select"
-            @change="handleStationChange"
-          >
-            <el-option
-              v-for="item in stationOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
+          <el-select v-model="stationValue" placeholder="閫夋嫨绔欏彴" class="station-select" @change="handleStationChange">
+            <el-option v-for="item in stationOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </div>
 
-    
+
         <div class="item">
           <div class="input-icon el-icon-mobile"></div>
-          <input
-            v-focus
-            type="text"
-            v-model="userInfo.verificationCode"
-            placeholder="杈撳叆楠岃瘉鐮�"
-          />
+          <input v-focus type="text" v-model="userInfo.verificationCode" placeholder="杈撳叆楠岃瘉鐮�" />
           <div class="code" @click="getVierificationCode">
             <img v-show="codeImgSrc != ''" :src="codeImgSrc" />
           </div>
         </div>
       </div>
       <div class="loging-btn">
-        <el-button
-          size="large"
-          :loading="loading"
-          color="#3a6cd1"
-          :dark="true"
-          @click="login"
-          long
-        >
+        <el-button size="large" :loading="loading" color="#3a6cd1" :dark="true" @click="login" long>
           <span v-if="!loading">鐧诲綍</span>
           <span v-else>姝e湪鐧诲綍...</span>
         </el-button>
@@ -100,17 +68,17 @@
     const codeImgSrc = ref("");
     const value = ref("");
     const userInfo = reactive({
-      userName: "",
-      password: "",
-      verificationCode: "",
+      userName: "admin",
+      password: "123456",
+      verificationCode: "1234",
       UUID: undefined,
     });
-     const stationValue = ref("");
-   const stationOptions = reactive([
+    const stationValue = ref("");
+    const stationOptions = reactive([
       { label: "绔欏彴2", value: "2-1" },
       { label: "绔欏彴3", value: "3-1" },
     ]);
-     // 鍒濆鍖栫珯鍙板��
+    // 鍒濆鍖栫珯鍙板��
     onMounted(() => {
       // 浠庢湰鍦板瓨鍌ㄥ姞杞戒繚瀛樼殑绔欏彴鍊�
       const savedStation = stationManager.getStation();
@@ -149,7 +117,7 @@
         return $message.error("璇疯緭鍏ラ獙璇佺爜");
       }
 
-          // 纭繚绔欏彴鍊煎凡淇濆瓨
+      // 纭繚绔欏彴鍊煎凡淇濆瓨
       if (stationValue.value) {
         stationManager.saveStation(stationValue.value);
         store.commit("setStation", stationValue.value);
@@ -184,7 +152,7 @@
       userInfo,
       loginPress,
       openUrl,
-     stationOptions,
+      stationOptions,
       stationValue,
       handleStationChange,
     };
@@ -228,7 +196,7 @@
 
       &.station-select-item {
         padding-left: 0;
-        
+
         .input-icon {
           margin-left: 20px;
           min-width: 20px;
@@ -367,9 +335,11 @@
     border: none;
     padding: 0;
     background: transparent;
-    
+
     // 绉婚櫎鎵�鏈塰over銆乫ocus鏁堟灉
-    &:hover, &:focus, &.is-focus {
+    &:hover,
+    &:focus,
+    &.is-focus {
       box-shadow: none !important;
       outline: none !important;
       border: none !important;
@@ -383,7 +353,7 @@
     font-size: 16px;
     color: #323233;
     cursor: pointer; // 娣诲姞鎸囬拡鏄剧ず涓哄彲鐐瑰嚮
-    
+
     &::placeholder {
       color: #c0c4cc;
     }
@@ -403,7 +373,9 @@
   }
 
   // 绉婚櫎鏁翠釜缁勪欢涓婄殑浠讳綍hover鍜宖ocus鏍峰紡
-  &:hover, &:focus, &.is-focus {
+  &:hover,
+  &:focus,
+  &.is-focus {
     :deep(.el-input__wrapper) {
       box-shadow: none !important;
       outline: none !important;
@@ -417,35 +389,35 @@
   border: 1px solid #ececec;
   border-radius: 5px;
   box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-  
+
   .el-select-dropdown__item {
     height: 45px;
     line-height: 45px;
     font-size: 16px;
     color: #323233;
     padding: 0 20px;
-    
+
     &:hover {
       background-color: #f5f7fa;
     }
-    
+
     &.selected {
       color: #3a6cd1;
       font-weight: normal;
       background-color: #f0f7ff;
     }
   }
-  
+
   // 闅愯棌婊氬姩鏉℃垨璋冩暣婊氬姩鏉℃牱寮�
   &::-webkit-scrollbar {
     width: 6px;
   }
-  
+
   &::-webkit-scrollbar-track {
     background: #f1f1f1;
     border-radius: 3px;
   }
-  
+
   &::-webkit-scrollbar-thumb {
     background: #c1c1c1;
     border-radius: 3px;
@@ -454,7 +426,9 @@
 
 // 绉婚櫎鎵�鏈塱nput鐨刦ocus鍜宧over鏍峰紡
 input {
-  &:hover, &:focus {
+
+  &:hover,
+  &:focus {
     border: none !important;
     outline: none !important;
     box-shadow: none !important;
@@ -532,6 +506,7 @@
 
 <style lang="less" scoped>
 @media screen and (max-width: 700px) {
+
   .login-bg,
   .account-info,
   .app-link,
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
index c59e488..90d3829 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
@@ -1,38 +1,14 @@
 
 <template>
-  <view-grid
-    ref="grid"
-    @openPalletDialog="handleOpenPalletDialog"
-    :columns="columns"
-    :detail="detail"
-    :editFormFields="editFormFields"
-    :editFormOptions="editFormOptions"
-    :searchFormFields="searchFormFields"
-    :searchFormOptions="searchFormOptions"
-    :table="table"
-    :extend="extend"
-  >
+  <view-grid ref="grid" @openPalletDialog="handleOpenPalletDialog" :columns="columns" :detail="detail"
+    :editFormFields="editFormFields" :editFormOptions="editFormOptions" :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions" :table="table" :extend="extend">
   </view-grid>
-      <!-- 2. 缁勭洏寮圭獥锛氱‘淇漰rops鍜屼簨浠剁粦瀹氭纭� -->
-    <PalletDialog
-      v-model:visible="palletVisible"  
-      :docNo="currentPalletDocNo"     
-      @back-success="handlePalletBackSuccess"  
-    ></PalletDialog>
-
 </template>
-    <script>
-import extend from "@/extension/inbound/inboundOrder.js";
-import ViewGrid from '@/components/basic/ViewGrid/ViewGrid.vue'; 
+<script>
+import extend from "@/extension/inbound/inboundOrder_copy.js";
 import { ref, defineComponent } from "vue";
-import PalletDialog from "@/extension/inbound/extend/Pallet.vue";
 export default defineComponent({
-   components: {
-    // 鍏抽敭淇2锛氱粍浠舵敞鍐屽悕涓庢ā鏉挎爣绛惧悕閫傞厤锛坘ebab-case瀵瑰簲view-grid锛�
-    viewGrid: ViewGrid,  // 娉ㄥ唽涓簁ebab-case锛屾ā鏉跨敤<view-grid>
-    PalletDialog      // 娉ㄥ唽缁勭洏寮圭獥
- 
-  },
   setup() {
     const table = ref({
       key: "id",
@@ -57,7 +33,7 @@
           type: "select",
           dataKey: "inOrderType",
           data: [],
-          hidden:true
+          hidden: true
         },
         {
           field: "inboundOrderNo",
@@ -149,7 +125,7 @@
         width: 150,
         align: "left",
         bind: { key: "inOrderType", data: [] },
-        hidden:true
+        hidden: true
       },
       {
         field: "businessType",
@@ -193,7 +169,7 @@
         field: "returnToMESStatus",
         title: "鍥炰紶MES鐘舵��",
         width: 120,
-        bind: { key: "createType", data:[{key:0, value:"鏈洖浼�"},{key:1, value:"宸插洖浼犳垚鍔�"},{key:2, value:"鍥炰紶澶辫触"}]},
+        bind: { key: "createType", data: [{ key: 0, value: "鏈洖浼�" }, { key: 1, value: "宸插洖浼犳垚鍔�" }, { key: 2, value: "鍥炰紶澶辫触" }] },
       },
       {
         field: "factoryArea",
@@ -375,20 +351,7 @@
       sortName: "id",
       key: "id",
     });
-     // 6. 缁勭洏寮圭獥鑱斿姩锛堟墍鏈夊彉閲忓繀椤昏繑鍥烇級
-    const palletVisible = ref(false);
-    const currentPalletDocNo = ref("");
 
-    const handleOpenPalletDialog = (docNo) => {
-      console.log('涓荤粍浠舵敹鍒扮粍鐩樹簨浠讹紝鍗曟嵁鍙凤細', docNo);
-      currentPalletDocNo.value = docNo;
-      palletVisible.value = true;
-    };
-
-    const handlePalletBackSuccess = () => {
-      console.log('缁勭洏鍥炰紶鎴愬姛锛屽埛鏂拌〃鏍�');
-      grid.value?.refresh();  // 姝ゆ椂gridRef宸叉寕杞斤紝鍙皟鐢ㄦ柟娉�
-    };
 
     return {
       table,
@@ -399,12 +362,12 @@
       searchFormOptions,
       columns,
       detail,
-       // 缁勭洏寮圭獥鐩稿叧
-      PalletDialog,    // 寮圭獥缁勪欢锛堟棤闇�杩斿洖锛屾敞鍐屽嵆鍙紝浣嗗彉閲忛渶杩斿洖锛�
-      palletVisible,
-      currentPalletDocNo,
-      handleOpenPalletDialog,
-      handlePalletBackSuccess
+      //  // 缁勭洏寮圭獥鐩稿叧
+      // PalletDialog,    // 寮圭獥缁勪欢锛堟棤闇�杩斿洖锛屾敞鍐屽嵆鍙紝浣嗗彉閲忛渶杩斿洖锛�
+      // palletVisible,
+      // currentPalletDocNo,
+      // handleOpenPalletDialog,
+      // handlePalletBackSuccess
     };
   },
 });
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db"
new file mode 100644
index 0000000..8ad8c3d
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-shm" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-shm"
new file mode 100644
index 0000000..c67f2e1
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-shm"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-wal" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-wal"
new file mode 100644
index 0000000..2bcc48b
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/CodeChunks.db-wal"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db"
new file mode 100644
index 0000000..cc734c2
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-shm" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-shm"
new file mode 100644
index 0000000..d00036d
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-shm"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-wal" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-wal"
new file mode 100644
index 0000000..9268501
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1231.31060/SemanticSymbols.db-wal"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/FileUtil.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/FileUtil.cs"
new file mode 100644
index 0000000..2aaeea4
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/FileUtil.cs"
@@ -0,0 +1,39 @@
+锘縰sing System;
+using System.IO;
+using System.Threading;
+
+namespace LogLibrary.Log
+{
+    public static class FileUtil
+    {
+       
+        /// <summary>
+        /// 杩藉姞鍐呭鍒版寚瀹氭枃浠朵腑
+        /// </summary>
+        /// <param name="filePath"></param>
+        /// <param name="content"></param>
+        public static void WriteAppend(string filePath, string content)
+        {
+            WriteAppend(filePath, new string[] { content });
+        }
+
+        public static void WriteAppend(string filePath, string[] contents)
+        {
+            using (FileStream fs = new(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
+            {
+                fs.Seek(fs.Length, SeekOrigin.Current);
+
+                string content = string.Join(Environment.NewLine, contents) + Environment.NewLine;
+
+                //byte[] data = System.Text.Encoding.GetEncoding("GB2312").GetBytes(content);
+                byte[] data = System.Text.Encoding.Default.GetBytes(content);
+
+
+                fs.Write(data, 0, data.Length);
+
+                fs.Close();
+                fs.Dispose();
+            }
+        }
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/ILog.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/ILog.cs"
new file mode 100644
index 0000000..11c5c38
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/ILog.cs"
@@ -0,0 +1,89 @@
+锘縰sing System;
+
+namespace LogLibrary.Log
+{
+    public unsafe interface ILog
+    {
+        bool* IsCryto { set; }
+        bool IsDebugEnabled { get; }
+
+        bool IsErrorEnabled { get; }
+
+        bool IsFatalEnabled { get; }
+
+        bool IsInfoEnabled { get; }
+
+        bool IsWarnEnabled { get; }
+
+        void Debug(bool isWriteFile, object message);
+
+        void Debug(bool isWriteFile, object message, Exception exception);
+
+        void DebugFormat(bool isWriteFile, string format, object arg0);
+
+        void DebugFormat(bool isWriteFile, string format, params object[] args);
+
+        void DebugFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args);
+
+        void DebugFormat(bool isWriteFile, string format, object arg0, object arg1);
+
+        void DebugFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2);
+
+        void Error(bool isWriteFile, object message);
+
+        void Error(bool isWriteFile, object message, Exception exception);
+
+        void ErrorFormat(bool isWriteFile, string format, object arg0);
+
+        void ErrorFormat(bool isWriteFile, string format, params object[] args);
+
+        void ErrorFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args);
+
+        void ErrorFormat(bool isWriteFile, string format, object arg0, object arg1);
+
+        void ErrorFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2);
+
+        void Fatal(bool isWriteFile, object message);
+
+        void Fatal(bool isWriteFile, object message, Exception exception);
+
+        void FatalFormat(bool isWriteFile, string format, object arg0);
+
+        void FatalFormat(bool isWriteFile, string format, params object[] args);
+
+        void FatalFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args);
+
+        void FatalFormat(bool isWriteFile, string format, object arg0, object arg1);
+
+        void FatalFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2);
+
+        void Info(bool isWriteFile, object message);
+
+        void Info(bool isWriteFile, object message, Exception exception);
+
+        //void InfoFormat(bool isWriteFile, string format, object arg0);
+
+        //void InfoFormat(bool isWriteFile, string format, params object[] args);
+
+        //void InfoFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args);
+
+        //void InfoFormat(bool isWriteFile, string format, object arg0, object arg1);
+
+        void InfoFormat(bool isWriteFile, object arg0, object arg1, object arg2);
+
+        void Warn(bool isWriteFile, object message);
+
+        void Warn(bool isWriteFile, object message, Exception exception);
+
+        void WarnFormat(bool isWriteFile, string format, object arg0);
+
+        void WarnFormat(bool isWriteFile, string format, params object[] args);
+
+        void WarnFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args);
+
+        void WarnFormat(bool isWriteFile, string format, object arg0, object arg1);
+
+        void WarnFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2);
+
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/ILogFactory.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/ILogFactory.cs"
new file mode 100644
index 0000000..520235a
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/ILogFactory.cs"
@@ -0,0 +1,7 @@
+锘縩amespace LogLibrary.Log
+{
+    public interface ILogFactory
+    {
+        ILog GetLog(string name);
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/Level.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/Level.cs"
new file mode 100644
index 0000000..0cfd286
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/Level.cs"
@@ -0,0 +1,16 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LogLibrary.Log
+{
+        public enum Level : int
+        {
+            Debug,
+            Info,
+            Warning,
+            Error
+        }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/Log.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/Log.cs"
new file mode 100644
index 0000000..6022c2a
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/Log.cs"
@@ -0,0 +1,755 @@
+锘縰sing System;
+using System.Text.RegularExpressions;
+
+namespace LogLibrary.Log
+{
+
+    public unsafe class Log 
+    {
+        private string m_Name;
+        private const string m_MessageTemplate = "{0}-{1}: {2}";
+
+        private const string m_Debug = "DEBUG";
+
+        private const string m_Error = "ERROR";
+
+        private const string m_Fatal = "FATAL";
+
+        private const string m_Info = "INFO";
+
+        private const string m_Warn = "WARN";
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Log"/> class.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        public Log(string name)
+        {
+            m_Name = name;
+        }
+        public Log()
+        {
+            m_Name = "NaN";
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this instance is debug enabled.
+        /// </summary>
+        /// <value>
+        ///     <c>true</c> if this instance is debug enabled; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsDebugEnabled
+        {
+            get { return true; }
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this instance is error enabled.
+        /// </summary>
+        /// <value>
+        ///     <c>true</c> if this instance is error enabled; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsErrorEnabled
+        {
+            get { return true; }
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this instance is fatal enabled.
+        /// </summary>
+        /// <value>
+        ///     <c>true</c> if this instance is fatal enabled; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsFatalEnabled
+        {
+            get { return true; }
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this instance is info enabled.
+        /// </summary>
+        /// <value>
+        ///     <c>true</c> if this instance is info enabled; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsInfoEnabled
+        {
+            get { return true; }
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this instance is warn enabled.
+        /// </summary>
+        /// <value>
+        ///     <c>true</c> if this instance is warn enabled; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsWarnEnabled
+        {
+            get { return true; }
+        }
+
+
+
+        public string GetDataTimeLog(string log)
+        {
+            return string.Format("[{0}] >>  {1}", DateTime.Now.ToString("yy-MM-dd HH:mm:ss"), log);
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        public void Debug(bool isWriteFile, object message)
+        {
+            string log = GetDataTimeLog(message.ToString());
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        /// <param name="exception">The exception.</param>
+        public void Debug(bool isWriteFile, object message, Exception exception)
+        {
+            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        public void DebugFormat(bool isWriteFile, string format, object arg0)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void DebugFormat(bool isWriteFile, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, string.Format(format, args));
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="provider">The provider.</param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void DebugFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, string.Format(provider, format, args));
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        public void DebugFormat(bool isWriteFile, string format, object arg0, object arg1)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the debug message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        /// <param name="arg2">The arg2.</param>
+        public void DebugFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1, arg2));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Debug, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Debug, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        public void Error(bool isWriteFile, object message)
+        {
+            string log = GetDataTimeLog(message.ToString());
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        /// <param name="exception">The exception.</param>
+        public void Error(bool isWriteFile, object message, Exception exception)
+        {
+            //string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
+            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message );
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        public void ErrorFormat(bool isWriteFile, string format, object arg0)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void ErrorFormat(bool isWriteFile, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="provider">The provider.</param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void ErrorFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(provider, format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        public void ErrorFormat(bool isWriteFile, string format, object arg0, object arg1)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        /// <param name="arg2">The arg2.</param>
+        public void ErrorFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg2));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Error, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Error, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        public void Fatal(bool isWriteFile, object message)
+        {
+            string log = GetDataTimeLog(message.ToString());
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        /// <param name="exception">The exception.</param>
+        public void Fatal(bool isWriteFile, object message, Exception exception)
+        {
+            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        public void FatalFormat(bool isWriteFile, string format, object arg0)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void FatalFormat(bool isWriteFile, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="provider">The provider.</param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void FatalFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(provider, format, args));
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        public void FatalFormat(bool isWriteFile, string format, object arg0, object arg1)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the fatal error message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        /// <param name="arg2">The arg2.</param>
+        public void FatalFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1, arg2));
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Fatal, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Fatal, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        public void Info(bool isWriteFile, object message)
+        {
+            string log = GetDataTimeLog(message.ToString());
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Info, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        /// <param name="exception">The exception.</param>
+        public void Info(bool isWriteFile, object message, Exception exception)
+        {
+            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Info, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        public void InfoFormat(bool isWriteFile, string format, object arg0)
+        {
+            string log = GetDataTimeLog(string.Format("\n{0}\n{1}\n-----------------------------------------------------------\n\n", format, arg0));
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Info, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        //public void InfoFormat(bool isWriteFile, string format, params object[] args)
+        //{
+        //    string log = GetDataTimeLog(string.Format(format, args));
+        //    Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+        //    if (isWriteFile)
+        //    {
+        //        LogUtil.WriteLogFile(m_Name, m_Info, log);
+        //    }
+        //}
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="provider">The provider.</param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        //public void InfoFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
+        //{
+        //    string log = GetDataTimeLog(string.Format(provider, format, args));
+        //    Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+        //    if (isWriteFile)
+        //    {
+        //        LogUtil.WriteLogFile(m_Name, m_Info, log);
+        //    }
+        //}
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        //public void InfoFormat(bool isWriteFile, string format, object arg0, object arg1)
+        //{
+        //    string log = GetDataTimeLog(string.Format(format, arg0, arg1));
+        //    Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+        //    if (isWriteFile)
+        //    {
+        //        LogUtil.WriteLogFile(m_Name, m_Info, log);
+        //    }
+        //}
+
+        /// <summary>
+        /// Logs the info message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        /// <param name="arg2">The arg2.</param>
+        public void InfoFormat(bool isWriteFile, object arg0, object arg1, object arg2)
+        {
+            string func(string str, int len)
+            {
+                var strSLen = Regex.Replace(str, @"[^\x00-\xff]", "aa").Length;
+                var strLen = str.Length;
+                return str.PadLeft(len - strSLen + strLen);
+            }
+            string log = GetDataTimeLog(string.Format("[{0}]\t[{1}]\t{2}", arg0?.ToString(), arg1?.ToString(), arg2));
+            //string log = GetDataTimeLog(string.Format("[{0}]  [{1}]  {2}", func(arg0?.ToString(), 13), func(arg1?.ToString(), 16), arg2));
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Info, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Info, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        public void Warn(bool isWriteFile, object message)
+        {
+            string log = GetDataTimeLog(message.ToString());
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="message">The message.</param>
+        /// <param name="exception">The exception.</param>
+        public void Warn(bool isWriteFile, object message, Exception exception)
+        {
+            string log = GetDataTimeLog(message + Environment.NewLine + exception.Message + exception.StackTrace);
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        public void WarnFormat(bool isWriteFile, string format, object arg0)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0));
+            //Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void WarnFormat(bool isWriteFile, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="provider">The provider.</param>
+        /// <param name="format">The format.</param>
+        /// <param name="args">The args.</param>
+        public void WarnFormat(bool isWriteFile, IFormatProvider provider, string format, params object[] args)
+        {
+            string log = GetDataTimeLog(string.Format(provider, format, args));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        public void WarnFormat(bool isWriteFile, string format, object arg0, object arg1)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        /// <summary>
+        /// Logs the warning message.
+        /// </summary>
+        /// <param name="isWriteFile"></param>
+        /// <param name="format">The format.</param>
+        /// <param name="arg0">The arg0.</param>
+        /// <param name="arg1">The arg1.</param>
+        /// <param name="arg2">The arg2.</param>
+        public void WarnFormat(bool isWriteFile, string format, object arg0, object arg1, object arg2)
+        {
+            string log = GetDataTimeLog(string.Format(format, arg0, arg1, arg2));
+            Console.WriteLine(m_MessageTemplate, m_Name, m_Warn, log);
+            if (isWriteFile)
+            {
+                LogUtil.WriteLogFile(m_Name, m_Warn, log);
+            }
+        }
+
+        //public void Behavior(string logMsg, Level level)
+        //{
+        //    lock (this)
+        //    {
+        //        m_Name = "琛屼负";
+        //        switch (level)
+        //        {
+        //            case Level.Debug:
+        //                Debug(true, logMsg);
+        //                break;
+        //            case Level.Info:
+        //                Info(true, logMsg);
+        //                break;
+        //            case Level.Warning:
+        //                Warn(true, logMsg);
+        //                break;
+        //            case Level.Error:
+        //                Error(true, logMsg);
+        //                break;
+        //            default:
+        //                break;
+        //        }
+        //    }
+        //}
+
+        //public void Interface(string logMsg, Level level)
+        //{
+        //    lock (this)
+        //    {
+        //        m_Name = "鎺ュ彛";
+        //        switch (level)
+        //        {
+        //            case Level.Debug:
+        //                Debug(true, logMsg);
+        //                break;
+        //            case Level.Info:
+        //                Info(true, logMsg);
+        //                break;
+        //            case Level.Warning:
+        //                Warn(true, logMsg);
+        //                break;
+        //            case Level.Error:
+        //                Error(true, logMsg);
+        //                break;
+        //            default:
+        //                break;
+        //        }
+        //    }
+        //}
+
+        //public void Hardware(string logMsg, Level level)
+        //{
+        //    lock (this)
+        //    {
+        //        m_Name = "纭欢";
+        //        switch (level)
+        //        {
+        //            case Level.Debug:
+        //                Debug(true, logMsg);
+        //                break;
+        //            case Level.Info:
+        //                Info(true, logMsg);
+        //                break;
+        //            case Level.Warning:
+        //                Warn(true, logMsg);
+        //                break;
+        //            case Level.Error:
+        //                Error(true, logMsg);
+        //                break;
+        //            default:
+        //                break;
+        //        }
+        //    }
+        //}
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/LogFactory.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/LogFactory.cs"
new file mode 100644
index 0000000..218faa9
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/LogFactory.cs"
@@ -0,0 +1,11 @@
+锘�
+namespace LogLibrary.Log
+{
+    public unsafe class LogFactory
+    {
+        public Log GetLog(string name)
+        {
+            return new Log(name);
+        }
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/LogUtil.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/LogUtil.cs"
new file mode 100644
index 0000000..9dd32fa
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Log/LogUtil.cs"
@@ -0,0 +1,57 @@
+锘縰sing System;
+using System.Diagnostics;
+using System.Threading;
+
+namespace LogLibrary.Log
+{
+    internal unsafe class LogUtil
+    {
+        static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
+
+        /// <summary>
+        /// 鏍煎紡寮忓寲Log淇℃伅
+        /// </summary>
+        /// <param name="format"></param>
+        /// <param name="name"></param>
+        /// <param name="logType"></param>
+        /// <param name="log"></param>
+        /// <returns></returns>
+        private static string GetLogString(string name, string logType, string log)
+        {
+            return string.Format("[{0}]{1}-{2}: {3}", DateTime.Now.ToString("HH:mm:ss"), name, logType, log);
+        }
+
+        /// <summary>
+        /// 鑾峰緱鏃ュ織瑕佷繚瀛樼殑璺緞
+        /// </summary>
+        /// <param name="name"></param>
+        /// <param name="logType"></param>
+        /// <returns></returns>
+        private static string GetLogPath(string name, string logType)
+        {
+            string path = AppDomain.CurrentDomain.BaseDirectory + $"Logs/{DateTime.Now:yyyyMM}";
+            if (!System.IO.Directory.Exists(path))
+            {
+                System.IO.Directory.CreateDirectory(path);
+            }
+
+            return System.IO.Path.Combine(path, string.Format("{0}_{1}_{2}.log", DateTime.Now.ToString("yyyy-MM-dd"), name, logType));
+        }
+
+        public static void WriteLogFile(string name, string logType, string log)
+        {
+            string logPath = GetLogPath(name, logType);
+            Trace.WriteLine(log);
+            lockSlim.EnterWriteLock();//鎵撳紑鍐欐搷浣滈攣
+            try
+            {
+                FileUtil.WriteAppend(logPath, log);
+            }
+            finally
+            {
+                lockSlim.ExitWriteLock();
+            }
+
+        }
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj"
new file mode 100644
index 0000000..552ea92
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj"
@@ -0,0 +1,47 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <OutputType>Library</OutputType>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <Configurations>Debug;Release;Dev</Configurations>
+    <Platforms>AnyCPU;x86</Platforms>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dev|x86'">
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Dev|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Dev\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dev|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Dev\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Dev|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Dev\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Properties/AssemblyInfo.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Properties/AssemblyInfo.cs"
new file mode 100644
index 0000000..a6c4576
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/LogLibrary/Properties/AssemblyInfo.cs"
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�鑸俊鎭敱浠ヤ笅
+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭��
+[assembly: AssemblyTitle("LogLibrary")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LogLibrary")]
+[assembly: AssemblyCopyright("Copyright 漏  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏� ComVisible 璁剧疆涓� false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵� COM 缁勪欢涓嶅彲瑙併�傚鏋滈渶瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�ц缃负 true銆�
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("2e0d9770-ab36-4811-a0d0-05b98093b92d")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�肩粍鎴�: 
+//
+//      涓荤増鏈�
+//      娆$増鏈�
+//      鐢熸垚鍙�
+//      淇鍙�
+//
+//鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滅敓鎴愬彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊�
+//閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs"
new file mode 100644
index 0000000..2648122
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/HttpClient/HttpsClient.cs"
@@ -0,0 +1,195 @@
+锘縰sing LogLibrary.Log;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_Common;
+
+public class HttpsClient
+{
+    private static readonly LogFactory LogFactory = new LogFactory();
+
+    // 灏佽涓�涓敤HttpClient鍙戦�丟ET璇锋眰鐨勬柟娉曟湁鍙傛暟
+    public static async Task<string> GetAsync(string url, Dictionary<string, object> parameters)
+    {
+        try
+        {
+            // 璁板綍璇锋眰鍙傛暟
+            LogRequestParameters(parameters, url);
+
+            // 灏嗗弬鏁版嫾鎺ュ埌URL涓�
+            string queryString = string.Join("&", parameters.Select(x => $"{x.Key}={x.Value}"));
+            url += "?" + queryString;
+
+            // 鍒涘缓HttpClient瀹炰緥
+            using (HttpClient client = new HttpClient())
+            {
+                // 鍙戦�丟ET璇锋眰骞惰幏鍙栧搷搴�
+                HttpResponseMessage response = await client.GetAsync(url);
+
+                // 纭繚鍝嶅簲鎴愬姛
+                response.EnsureSuccessStatusCode();
+
+                // 璇诲彇鍝嶅簲鍐呭
+                string responseBody = await response.Content.ReadAsStringAsync();
+
+                // 璁板綍鍝嶅簲鍙傛暟
+                LogResponseParameters(responseBody, url);
+
+                // 杩斿洖鍝嶅簲鍐呭
+                return responseBody;
+            }
+        }
+        catch (Exception ex)
+        {
+            LogErrorParameters(ex.StackTrace, ex.Message, url);
+            return ex.Message;
+        }
+    }
+
+    // 鐢ㄤ簬杩借釜姣忎釜璇锋眰鐨勮皟鐢ㄦ鏁板拰鏈�鍚庤姹傛椂闂淬��
+    //private static readonly Dictionary<string, (int Count, DateTime LastRequestTime)> requestTracker = new();
+    // 灏佽涓�涓敤HttpClient鍙戦�丳ost璇锋眰鐨勬柟娉曟湁鍙傛暟
+    public static async Task<string> PostAsync(string url, Dictionary<string, object> parameters)
+    {
+        try
+        {
+            //// 鍒涘缓涓�涓柊鐨勫瓧鍏革紝鎺掗櫎 RequestTime 鍜� SessionId
+            //var filteredParameters = parameters.Where(p => p.Key != "RequestTime" && p.Key != "SessionId").ToDictionary(p => p.Key, p => p.Value);
+
+            //string requestKey = $"{url}:{JsonConvert.SerializeObject(filteredParameters)}";
+            //// 妫�鏌ヨ姹傛鏁板拰鏃堕棿闄愬埗
+            //if (requestTracker.TryGetValue(requestKey, out var requestInfo))
+            //{
+            //    if (requestInfo.Count >= 5 && DateTime.Now < requestInfo.LastRequestTime.AddMinutes(3))
+            //    {
+            //        // 濡傛灉璇锋眰娆℃暟瓒呰繃闄愬埗涓旀湭瓒呰繃10鍒嗛挓锛屾姏鍑哄紓甯�
+            //        throw new InvalidOperationException("璇锋眰娆℃暟宸茶揪鍒伴檺鍒讹紝璇风◢鍚庡啀璇曘��");
+            //    }
+            //}
+
+            //// 鏇存柊璇锋眰璺熻釜淇℃伅
+            //if (requestTracker.ContainsKey(requestKey))
+            //{
+            //    requestTracker[requestKey] = (requestInfo.Count + 1, DateTime.Now);
+            //}
+            //else
+            //{
+            //    requestTracker[requestKey] = (1, DateTime.Now);
+            //}
+
+
+            // 璁板綍璇锋眰鍙傛暟
+            LogRequestParameters(parameters, url);
+
+            // 鍒涘缓HttpClient瀹炰緥
+            using (HttpClient client = new HttpClient())
+            {
+                // 灏嗗弬鏁拌浆鎹负FormUrlEncodedContent
+                string content = JsonConvert.SerializeObject(parameters);
+
+                var request = new HttpRequestMessage(HttpMethod.Post, url);
+
+                request.Content = new StringContent(content, Encoding.UTF8, "application/json");
+
+                HttpResponseMessage response = await client.SendAsync(request);
+
+                // 纭繚鍝嶅簲鎴愬姛
+                response.EnsureSuccessStatusCode();
+
+                // 璇诲彇鍝嶅簲鍐呭
+                string responseBody = await response.Content.ReadAsStringAsync();
+
+                // 璁板綍鍝嶅簲鍙傛暟
+                LogResponseParameters(responseBody, url);
+
+                // 杩斿洖鍝嶅簲鍐呭
+                return responseBody;
+            }
+        }
+        catch (Exception ex)
+        {
+            LogErrorParameters(ex.StackTrace,ex.Message, url);
+            return ex.Message;
+        }
+        
+    }
+
+
+    public static async Task<string> PostAsync(string url, string requestJson = null, string contentType = "application/json", Dictionary<string, string>? headers = null)
+    {
+        try
+        {
+            LogRequestParameters(requestJson, url);
+
+            string result = string.Empty;
+            using (HttpContent httpContent = new StringContent(requestJson))
+            {
+                httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
+                using HttpClient httpClient = new HttpClient();
+                httpClient.Timeout = new TimeSpan(0, 0, 60);
+
+                if (headers != null)
+                {
+                    foreach (var header in headers)
+                        httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
+                }
+                result = await httpClient.PostAsync(url, httpContent).Result.Content.ReadAsStringAsync();
+            }
+            LogResponseParameters(result, url);
+
+            return result;
+        
+        }
+        catch (Exception ex)
+        {
+            LogErrorParameters(ex.StackTrace, ex.Message, url);
+            Console.WriteLine(ex.Message);
+        }
+        return null;
+    }
+    private static void LogErrorParameters(string errordetail, string error, string url = "")
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(Environment.NewLine);
+        builder.Append("---------------------------------------------");
+        builder.Append(Environment.NewLine);
+        builder.Append("url:" + url + "寮傚父璇︾粏淇℃伅: " + JsonConvert.SerializeObject(error));
+        builder.Append("url:" + url + "寮傚父淇℃伅: " + JsonConvert.SerializeObject(error));
+        LogFactory.GetLog("API鎺ュ彛寮傚父").Error(true, builder);
+    }
+    private static void LogRequestParameters(Dictionary<string, object> parameters, string url = "")
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(Environment.NewLine);
+        builder.Append("---------------------------------------------");
+        builder.Append(Environment.NewLine);
+        builder.Append("url:" + url + "璇锋眰鍙傛暟: " + JsonConvert.SerializeObject(parameters));
+        LogFactory.GetLog("API鎺ュ彛").Info(true, builder);
+    }
+
+    private static void LogRequestParameters(string parameters, string url = "")
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(Environment.NewLine);
+        builder.Append("---------------------------------------------");
+        builder.Append(Environment.NewLine);
+        builder.Append("url:" + url + "璇锋眰鍙傛暟: " + JsonConvert.SerializeObject(parameters));
+        LogFactory.GetLog("API鎺ュ彛").Info(true, builder);
+    }
+
+    private static void LogResponseParameters(string responseBody, string url = "")
+    {
+        StringBuilder builder = new StringBuilder();
+        builder.Append(Environment.NewLine);
+        builder.Append("url:" + url + "鍝嶅簲鍙傛暟: " + responseBody);
+        builder.Append(Environment.NewLine);
+        builder.Append("---------------------------------------------");
+        builder.Append(Environment.NewLine);
+        LogFactory.GetLog("API鎺ュ彛").Info(true, builder);
+    }
+}
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj"
index f14a168..26765d6 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj"
@@ -12,4 +12,12 @@
     <None Remove="Location\**" />
   </ItemGroup>
 
+  <ItemGroup>
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+  </ItemGroup>
+
 </Project>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/GroupPalletDto.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/GroupPalletDto.cs"
new file mode 100644
index 0000000..8e1954b
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Inbound/GroupPalletDto.cs"
@@ -0,0 +1,23 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEA_Core.Attributes;
+
+namespace WIDESEA_DTO.Inbound
+{
+    [ModelValidate]
+    public class GroupPalletDto
+    {
+        [PropertyValidate("鎵樼洏缂栧彿", NotNullAndEmpty = true)]
+        public string PalletCode { get; set; }
+
+        [PropertyValidate("搴忓垪鍙锋潯鐮�", NotNullAndEmpty = true)]
+        public string Barcode { get; set; }
+
+        public string locationType { get; set; }
+
+        public string WarehouseType { get; set; }
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs"
index 15237d5..2b55554 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundService.cs"
@@ -4,6 +4,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEA_Core;
+using WIDESEA_DTO.Inbound;
 
 namespace WIDESEA_IInboundService
 {
@@ -12,5 +13,12 @@
         IInboundOrderDetailService InboundOrderDetailService { get; }
 
         IInboundOrderService InbounOrderService { get; }
+
+        /// <summary>
+        /// 缁勭洏
+        /// </summary>
+        /// <param name="palletDto"></param>
+        /// <returns></returns>
+        Task<WebResponseContent> GroupPallet(GroupPalletDto palletDto);
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs"
index 97a2766..d35fbfe 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs"
@@ -1,22 +1,233 @@
-锘縰sing System;
+锘縰sing LogLibrary.Log;
+using MailKit;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEA_Common.CommonEnum;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
+using WIDESEA_Core;
+using WIDESEA_Core.BaseRepository;
+using WIDESEA_Core.Helper;
+using WIDESEA_Core.Utilities;
+using WIDESEA_DTO.Inbound;
 using WIDESEA_IInboundService;
+using WIDESEA_IStockService;
+using WIDESEA_Model.Models;
+using WIDESEA_Model.Models.Basic;
 
 namespace WIDESEA_InboundService
 {
     public class InboundService : IInboundService
     {
+        LogFactory LogFactory = new LogFactory();
+        private readonly IUnitOfWorkManage _unitOfWorkManage;
         public IInboundOrderDetailService InboundOrderDetailService { get; }
 
         public IInboundOrderService InbounOrderService { get; }
+        private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
+        private readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository;
+        private readonly IRepository<Dt_LocationType> _locationTypeRepository;
+        private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
+        private readonly IRepository<Dt_InboundOrderDetail> _inboundOrderDetailRepository;
+        private readonly IRepository<Dt_Task> _taskRepository;
+        private IStockService _stockService;
 
-        public InboundService(IInboundOrderDetailService inboundOrderDetailService, IInboundOrderService inbounOrderService)
+        public InboundService(IUnitOfWorkManage unitOfWorkManage, IInboundOrderDetailService inboundOrderDetailService, IInboundOrderService inbounOrderService, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IStockService stockService, IRepository<Dt_Task> taskRepository)
         {
+            _unitOfWorkManage = unitOfWorkManage;
             InboundOrderDetailService = inboundOrderDetailService;
             InbounOrderService = inbounOrderService;
+            _inboundOrderRepository = inboundOrderRepository;
+            _warehouseAreaRepository = warehouseAreaRepository;
+            _locationTypeRepository = locationTypeRepository;
+            _stockInfoRepository = stockInfoRepository;
+            _inboundOrderDetailRepository = inboundOrderDetailRepository;
+            _stockService = stockService;
+            _taskRepository = taskRepository;
+        }
+
+        public async Task<WebResponseContent> GroupPallet(GroupPalletDto palletDto)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                (bool, string, object?) result2 = ModelValidate.ValidateModelData(palletDto);
+                if (!result2.Item1) return content.Error(result2.Item2);
+
+                var code = _warehouseAreaRepository.Db.Queryable<Dt_WarehouseArea>().Where(x => x.Code == palletDto.WarehouseType).Select(x => x.Code).First();
+                if (string.IsNullOrEmpty(code))
+                {
+                    return content.Error($"浠撳簱涓病鏈夎{palletDto.WarehouseType}缂栧彿銆�");
+                }
+
+                List<Dt_InboundOrderDetail> details = new List<Dt_InboundOrderDetail>();
+                Dt_InboundOrder inboundOrder = new Dt_InboundOrder();
+                details = _inboundOrderDetailRepository.QueryData(x => x.OutBoxbarcodes == palletDto.Barcode && x.OrderDetailStatus == (int)InOrderStatusEnum.鏈紑濮�);
+                if (details.Count <= 0)
+                {
+                    details = _inboundOrderDetailRepository.QueryData(x => x.Barcode == palletDto.Barcode && x.OrderDetailStatus == (int)InOrderStatusEnum.鏈紑濮�);
+                }
+
+                if (details.Count() <= 0)
+                {
+                    return content.Error("鏈壘鍒拌鏉$爜鍗曟嵁淇℃伅璇风‘璁ゆ槸鍚﹀凡缁忕粍鐩樺畬鎴�");
+                }
+                inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Includes(x=>x.Details).Where(x => x.Id == details.First().OrderId).First();
+
+                if (inboundOrder == null)
+                {
+                    return content.Error("鏈壘鍒拌鏉$爜涓诲崟淇℃伅");
+                }
+                Dt_StockInfo? stockInfo = await _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == palletDto.PalletCode).FirstAsync();
+
+                List<string?> materielCodes = details.GroupBy(x => x.Barcode).Select(x => x.Key).ToList();
+
+                (bool, string, object?) result = CheckMaterielGroupParam(palletDto, materielCodes, inboundOrder, stockInfo);
+                if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2);
+
+
+                if (stockInfo == null)
+                {
+                    stockInfo = new Dt_StockInfo() { PalletType = (int)PalletTypeEnum.None, LocationType = Convert.ToInt32(palletDto.locationType) };
+                    stockInfo.Details = new List<Dt_StockInfoDetail>();
+                }
+
+                foreach (var item in details)
+                {
+                    stockInfo.Details.Add(new Dt_StockInfoDetail
+                    {
+                        StockId = stockInfo == null ? 0 : stockInfo.Id,
+                        Barcode = item.Barcode,
+                        MaterielCode = item.MaterielCode,
+                        BatchNo = item.BatchNo,
+                        Unit = item.Unit,
+                        InboundOrderRowNo = item.lineNo,
+                        SupplyCode = item.SupplyCode,
+                        WarehouseCode = palletDto.WarehouseType,
+                        StockQuantity = item.OrderQuantity,
+                        BarcodeQty = item.BarcodeQty,
+                        BarcodeUnit = item.BarcodeUnit,
+                        FactoryArea = inboundOrder.FactoryArea,
+                        Status = 0,
+                        OrderNo = inboundOrder.InboundOrderNo,
+                        BusinessType = inboundOrder.BusinessType,
+
+                    });
+
+                    item.ReceiptQuantity = item.BarcodeQty;
+                    item.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
+                    item.WarehouseCode = palletDto.WarehouseType;
+                    item.ReturnToMESStatus = 0;
+                }
+
+                if (stockInfo.Id == 0)
+                {
+                    stockInfo.PalletCode = palletDto.PalletCode;
+                    stockInfo.StockStatus = (int)StockStatusEmun.缁勭洏鏆傚瓨;
+                }
+                stockInfo.PalletType = (int)PalletTypeEnum.None;
+
+                List<int> updateDetailIds = details.Select(x => x.Id).ToList();
+                if (inboundOrder.OrderStatus == (int)InOrderStatusEnum.鏈紑濮�)
+                {
+                    inboundOrder.OrderStatus = (int)InOrderStatusEnum.鍏ュ簱涓�;
+                }
+                inboundOrder.Operator = App.User.UserName;
+                content = MaterielGroupUpdateData(inboundOrder, details, stockInfo).Result;
+                if (content.Status)
+                {
+                    Dt_StockInfo? NewstockInfo = await _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == palletDto.PalletCode).FirstAsync();
+
+                    return WebResponseContent.Instance.OK(data: NewstockInfo.Details);
+                }
+                else
+                {
+                    content = WebResponseContent.Instance.Error(content.Message);
+                }
+            }
+            catch (Exception ex)
+            {
+                LogFactory.GetLog($"缁勭洏淇℃伅").Info(true, $"銆愬紓甯搞�戯細銆恵ex.Message}銆憑Environment.NewLine}銆恵ex.StackTrace}銆憑Environment.NewLine}{Environment.NewLine}");
+                return content.Error(ex.Message);
+            }
+            return content;
+        }
+
+        /// <summary>
+        /// 楠岃瘉缁勭洏鏁版嵁
+        /// </summary>
+        /// <param name="materielGroupDTO">鐗╂枡缁勭洏DTO</param>
+        /// <param name="matSerialNumberDTOs">鎵爜搴忓垪鍙�</param>
+        /// <param name="materielInfos">鐗╂枡淇℃伅</param>
+        /// <param name="materielCodes">鐗╂枡缂栧彿</param>
+        /// <param name="inboundOrder">鍏ュ簱鍗曟嵁</param>
+        /// <param name="stockInfo">缁勭洏淇℃伅</param>
+        /// <returns></returns>
+        public (bool, string, object?) CheckMaterielGroupParam(GroupPalletDto materielGroupDTO, List<string> barcodeCodes, Dt_InboundOrder inboundOrder, Dt_StockInfo stockInfo)
+        {
+            (bool, string, object?) result = ModelValidate.ValidateModelData(materielGroupDTO);
+            if (!result.Item1) return result;
+
+            if (_taskRepository.QueryFirst(x => x.PalletCode == materielGroupDTO.PalletCode) != null)
+            {
+                return (false, "璇ユ墭鐩樺彿宸叉湁浠诲姟", materielGroupDTO);
+            }
+
+            if (stockInfo != null && !string.IsNullOrEmpty(stockInfo.LocationCode) && stockInfo.StockStatus != (int)StockStatusEmun.缁勭洏鏆傚瓨)
+            {
+                return (false, "宸蹭笂鏋剁殑鎵樼洏涓嶈兘鍐嶆缁勭洏", materielGroupDTO);
+            }
+
+            if (_stockService.StockInfoDetailService.ExistBarcodes(barcodeCodes))
+            {
+                return (false, $"{barcodeCodes[0]} 鏉$爜鍦ㄥ簱瀛樹腑宸插瓨鍦�", materielGroupDTO);
+            }     
+
+            if (inboundOrder == null)
+            {
+                return (false, "鍗曟嵁涓嶅瓨鍦�", materielGroupDTO);
+            }
+
+            if (inboundOrder.Details == null || inboundOrder.Details.Count == 0)
+            {
+                return (false, "鏃犲崟鎹槑缁嗕俊鎭�", materielGroupDTO);
+            }
+
+            if (inboundOrder.OrderStatus != (int)InOrderStatusEnum.鏈紑濮� && inboundOrder.OrderStatus != (int)InOrderStatusEnum.鍏ュ簱涓�)
+            {
+                return (false, "璇ュ崟鎹笉鍙啀缁勭洏", materielGroupDTO);
+            }
+
+            List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => barcodeCodes.Contains(x.Barcode)).ToList();
+
+            if (inboundOrderDetails.GroupBy(x => x.Barcode).Count() != barcodeCodes.Count)
+            {
+                return (false, "鏈夌墿鏂欎笉鍦ㄥ崟鎹唴", materielGroupDTO);
+            }
+
+            return (true, "鎴愬姛", materielGroupDTO);
+        }
+
+        public async Task<WebResponseContent> MaterielGroupUpdateData(Dt_InboundOrder inboundOrder, List<Dt_InboundOrderDetail> inboundOrderDetails, Dt_StockInfo stockInfo)
+        {
+            try
+            {
+                _unitOfWorkManage.BeginTran();
+                //await _inboundOrderRepository.Db.UpdateNav(inboundOrder).Include(x=>x.Details).ExecuteCommandAsync();
+                _inboundOrderRepository.UpdateData(inboundOrder);
+                _inboundOrderDetailRepository.UpdateData(inboundOrderDetails);
+                _stockService.StockInfoService.AddMaterielGroup(stockInfo);
+                _unitOfWorkManage.CommitTran();
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
         }
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln"
index 7b8e7db..8026feb 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer.sln"
@@ -74,6 +74,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEA_IAllocateService", "WIDESEA_IAllocateService\WIDESEA_IAllocateService.csproj", "{A6E822A3-5A09-4B18-BEE6-57CC7D7B8BEC}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LogLibrary", "LogLibrary\LogLibrary.csproj", "{A7C339A4-CC00-2872-6005-A272626BC5F1}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -360,6 +362,18 @@
 		{A6E822A3-5A09-4B18-BEE6-57CC7D7B8BEC}.Release|Any CPU.Build.0 = Release|Any CPU
 		{A6E822A3-5A09-4B18-BEE6-57CC7D7B8BEC}.Release|x86.ActiveCfg = Release|Any CPU
 		{A6E822A3-5A09-4B18-BEE6-57CC7D7B8BEC}.Release|x86.Build.0 = Release|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Debug|x86.ActiveCfg = Debug|x86
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Debug|x86.Build.0 = Debug|x86
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Dev|Any CPU.ActiveCfg = Dev|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Dev|Any CPU.Build.0 = Dev|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Dev|x86.ActiveCfg = Dev|x86
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Dev|x86.Build.0 = Dev|x86
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|x86.ActiveCfg = Release|x86
+		{A7C339A4-CC00-2872-6005-A272626BC5F1}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundController.cs"
new file mode 100644
index 0000000..df6c7a3
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundController.cs"
@@ -0,0 +1,32 @@
+锘�
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
+using WIDESEA_DTO.CalcOut;
+using WIDESEA_DTO.Inbound;
+
+namespace WIDESEA_WMSServer.Controllers.Outbound
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class InboundController : ControllerBase
+    {
+        private readonly WIDESEA_IInboundService.IInboundService Service;
+        public InboundController(WIDESEA_IInboundService.IInboundService inboundService)
+        {
+            Service = inboundService;
+        }
+
+        /// <summary>
+        /// 缁勭洏
+        /// </summary>
+        /// <param name="palletDto"></param>
+        /// <returns></returns>
+        [HttpPost, Route("GroupPallet"), AllowAnonymous]
+        public async Task<WebResponseContent> GroupPallet([FromBody]GroupPalletDto palletDto)
+        {
+            return await Service.GroupPallet(palletDto);
+        }
+    }
+}

--
Gitblit v1.9.3