From 70aa9b5ca249a84e5867912d551cdafbec76e54e Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期五, 05 十二月 2025 09:45:17 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu

---
 项目代码/WIDESEA_WMSClient/src/views/outbound/BatchPickingConfirm.vue | 1007 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 803 insertions(+), 204 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/BatchPickingConfirm.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/BatchPickingConfirm.vue"
index b938edd..48d960a 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/BatchPickingConfirm.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/BatchPickingConfirm.vue"
@@ -92,7 +92,7 @@
     </div>
 
     <!-- 鎷嗗寘寮圭獥 -->
-    <div  v-show="showCustomSplitDialog" class="custom-dialog-overlay" style="z-index: 2001;">
+    <div v-if="showCustomSplitDialog" class="custom-dialog-overlay" style="z-index: 2000;">
       <div class="custom-dialog-wrapper">
         <div class="custom-dialog">
           <div class="custom-dialog-header">
@@ -154,7 +154,7 @@
     </div>
 
     <!-- 鎾ら攢鎷嗗寘寮圭獥 -->
-    <div  v-show="showRevertSplitDialog" class="custom-dialog-overlay" style="z-index: 2001;">
+    <div v-if="showRevertSplitDialog" class="custom-dialog-overlay"  style="z-index: 2001;">
       <div class="custom-dialog-wrapper">
         <div class="custom-dialog">
           <div class="custom-dialog-header">
@@ -214,7 +214,7 @@
     </div>
 
     <!-- 鎷嗗寘閾句俊鎭脊绐� -->
-<div v-show="showSplitChainDialog" class="custom-dialog-overlay" style="z-index: 2003;">
+<div v-if="showSplitChainDialog" class="custom-dialog-overlay"  style="z-index: 2002;">
   <div class="custom-dialog-wrapper">
     <div class="custom-dialog" style="width: 750px;">
       <div class="custom-dialog-header">
@@ -338,7 +338,7 @@
 </div>
 
     <!-- 鎵归噺鍥炲簱寮圭獥 -->
-    <div v-if="showBatchReturnDialog" class="custom-dialog-overlay"  style="z-index: 2004;">
+    <div v-if="showBatchReturnDialog" class="custom-dialog-overlay"  style="z-index: 2003;">
       <div class="custom-dialog-wrapper">
         <div class="custom-dialog">
           <div class="custom-dialog-header">
@@ -370,7 +370,7 @@
     </div>
 
     <!-- 鍙栬蛋绌虹寮圭獥 -->
-    <div v-if="showEmptyPalletDialog" class="custom-dialog-overlay"  style="z-index: 2005;">
+    <div v-if="showEmptyPalletDialog" class="custom-dialog-overlay"  style="z-index: 2004;">
       <div class="custom-dialog-wrapper">
         <div class="custom-dialog">
           <div class="custom-dialog-header">
@@ -405,20 +405,20 @@
   </div>
 </template>
 
+ 
+ 
 <script>
 import http from '@/api/http.js'
-import { ref, defineComponent } from "vue";
+import { defineComponent } from "vue";
 import { ElMessage } from 'element-plus' 
-import { useRoute } from 'vue-router'
 import printView from "@/extension/outbound/extend/printView.vue"
-
 
 export default defineComponent({
   name: 'BatchOutboundPicking',
   components: {printView},
   data() {
     return {
-      // 淇濇寔鍘熷鏁版嵁缁撴瀯涓嶅彉
+      // 淇濇寔鎵�鏈夊師濮嬫暟鎹粨鏋勪笉鍙�...
       scanData: {
         orderNo: '',
         palletCode: '',
@@ -434,13 +434,16 @@
       },
       palletStatus: '鏈煡',
       
-      // 寮圭獥鐘舵�� - 淇濇寔鍘熷鐘舵��
+      // 寮圭獥鐘舵�� - 鍏抽敭淇锛氬彧鍏佽涓�涓脊绐楁墦寮�
+      activeDialog: null, // 'split', 'revert', 'batchReturn', 'emptyPallet', 'splitChain'
       showCustomSplitDialog: false,
       showRevertSplitDialog: false,
       showBatchReturnDialog: false,
       showEmptyPalletDialog: false,
       showSplitChainDialog: false,
       
+        // 娣诲姞闃查噸澶嶇偣鍑绘爣蹇�
+      isOpeningDialog: false,
       // 鍔犺浇鐘舵��
       splitLoading: false,
       revertSplitLoading: false,
@@ -448,7 +451,7 @@
       emptypalletOutLoading: false,
       splitChainLoading: false,
       
-      // 琛ㄥ崟鏁版嵁
+      // 琛ㄥ崟鏁版嵁...
       splitForm: {
         orderNo: '',
         palletCode: '',
@@ -474,14 +477,13 @@
         palletCode: ''
       },
       
-      // 鎷嗗寘閾剧浉鍏虫暟鎹�
       splitChainInfo: {
         originalBarcode: '',
         totalSplitTimes: 0,
         splitChain: []
       },
       
-      // 楠岃瘉瑙勫垯
+      // 楠岃瘉瑙勫垯...
       splitFormRules: {
         originalBarcode: [
           { required: true, message: '璇疯緭鍏ュ師鏉$爜', trigger: 'blur' }
@@ -504,10 +506,17 @@
         ]
       },
       
-      isProcessing: false,
-      
-      // 鏂板: 鐢ㄤ簬闃叉寮圭獥閲嶅彔
-      isDialogOpening: false
+      isProcessing: false
+    }
+  },
+  watch: {
+    // 鍏抽敭淇锛氱‘淇濆悓涓�鏃堕棿鍙湁涓�涓脊绐楁墦寮�
+    activeDialog(newVal, oldVal) {
+      this.showCustomSplitDialog = newVal === 'split'
+      this.showRevertSplitDialog = newVal === 'revert'
+      this.showBatchReturnDialog = newVal === 'batchReturn'
+      this.showEmptyPalletDialog = newVal === 'emptyPallet'
+      this.showSplitChainDialog = newVal === 'splitChain'
     }
   },
   computed: {
@@ -523,16 +532,20 @@
       this.batchReturnForm.orderNo = this.$route.query.orderNo;
       this.emptypalletOutForm.orderNo = this.$route.query.orderNo;
     }
-    this.$nextTick(() => {
-      this.$refs.palletInput.focus();
+    // 浣跨敤 requestAnimationFrame 纭繚椤甸潰瀹屽叏鍔犺浇
+    requestAnimationFrame(() => {
+      if (this.$refs.palletInput) {
+        this.$refs.palletInput.focus();
+      }
     });
+ 
   },
   methods: {
     goBack(){
       this.$router.back()
     },
 
-    // 淇: 娣诲姞闃查噸澶嶇偣鍑绘満鍒�
+    // 鍒嗘嫞鐩稿叧鏂规硶
     async confirmPicking() {
       if (this.isProcessing) return;
       
@@ -572,41 +585,445 @@
       }
     },
 
-    // 淇: 鎵撳紑鎷嗗寘寮圭獥 - 娣诲姞闃查噸鍙犳満鍒�
-    openSplitDialog() {
-      if (this.isDialogOpening) return;
+   openSplitDialog() {
+      console.log('绱ф�ヤ慨澶嶇増锛氭墦寮�鎷嗗寘寮圭獥');
       
       if (!this.scanData.palletCode) {
         this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�');
         return;
       }
       
-      this.isDialogOpening = true;
+      // 1. 鍏抽棴鎵�鏈塚ue寮圭獥
+      this.closeAllDialogs();
+      
+      // 2. 寮哄埗浠嶥OM涓Щ闄ゆ墍鏈夊脊绐�
+      setTimeout(() => {
+        const dialogs = document.querySelectorAll('.custom-dialog-overlay');
+        dialogs.forEach(dialog => {
+          if (dialog.parentNode) {
+            dialog.parentNode.removeChild(dialog);
+          }
+        });
+        
+        // 濡傛灉宸茬粡瀛樺湪鎵嬪姩寮圭獥锛屽厛绉婚櫎
+        if (this.manualDialog && this.manualDialog.parentNode) {
+          this.manualDialog.parentNode.removeChild(this.manualDialog);
+        }
+        
+        // 3. 绛夊緟涓�甯�
+        requestAnimationFrame(() => {
+          // 4. 鐩存帴鍒涘缓鏂板脊绐楋紝涓嶄緷璧朧ue鐨勫搷搴斿紡绯荤粺
+          this.createManualSplitDialog();
+        });
+      }, 10);
+    },
+    
+    // 鍒涘缓鎵嬪姩鎷嗗寘寮圭獥
+    createManualSplitDialog() {
+      const newDialog = document.createElement('div');
+      newDialog.className = 'custom-dialog-overlay emergency-fix';
+      
+      // 鐢熸垚闅忔満ID鐢ㄤ簬浜嬩欢缁戝畾
+      const dialogId = 'manual-dialog-' + Date.now();
+      newDialog.id = dialogId;
+      
+      // 瀛樺偍寮曠敤
+      this.manualDialog = newDialog;
+      
+      // 寮圭獥鍐呭
+      newDialog.innerHTML = `
+        <div class="custom-dialog-wrapper">
+          <div class="custom-dialog" style="width: 500px;">
+            <div class="custom-dialog-header">
+              <h3 style="margin: 0; color: #303133;">鎷嗗寘鎿嶄綔</h3>
+              <button class="close-button" onclick="document.getElementById('${dialogId}').remove()" style="
+                font-size: 18px;
+                color: #909399;
+                padding: 0;
+                width: 24px;
+                height: 24px;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                background: none;
+                border: none;
+                cursor: pointer;
+              ">脳</button>
+            </div>
+            <div class="custom-dialog-body" style="padding: 20px;">
+              <div style="margin-bottom: 15px;">
+                <div style="display: flex; align-items: center; margin-bottom: 5px;">
+                  <span style="width: 100px; text-align: right; padding-right: 12px; color: #606266;">璁㈠崟缂栧彿:</span>
+                  <input type="text" value="${this.scanData.orderNo}" disabled style="
+                    flex: 1;
+                    padding: 8px 12px;
+                    border: 1px solid #dcdfe6;
+                    border-radius: 4px;
+                    background-color: #f5f7fa;
+                    color: #909399;
+                  ">
+                </div>
+              </div>
+              
+              <div style="margin-bottom: 15px;">
+                <div style="display: flex; align-items: center; margin-bottom: 5px;">
+                  <span style="width: 100px; text-align: right; padding-right: 12px; color: #606266;">鎵樼洏缂栧彿:</span>
+                  <input type="text" value="${this.scanData.palletCode}" disabled style="
+                    flex: 1;
+                    padding: 8px 12px;
+                    border: 1px solid #dcdfe6;
+                    border-radius: 4px;
+                    background-color: #f5f7fa;
+                    color: #909399;
+                  ">
+                </div>
+              </div>
+              
+              <div style="margin-bottom: 15px;">
+                <div style="display: flex; align-items: center; margin-bottom: 5px;">
+                  <span style="width: 100px; text-align: right; padding-right: 12px; color: #606266;">鍘熸潯鐮�:</span>
+                  <div style="flex: 1; display: flex; align-items: center; gap: 10px;">
+                    <input type="text" id="${dialogId}-barcode" placeholder="鎵弿鍘熸潯鐮�" style="
+                      flex: 1;
+                      padding: 8px 12px;
+                      border: 1px solid #dcdfe6;
+                      border-radius: 4px;
+                    ">
+                    <button id="${dialogId}-viewChain" style="
+                      padding: 8px 16px;
+                      background: #409eff;
+                      color: white;
+                      border: none;
+                      border-radius: 4px;
+                      cursor: pointer;
+                      white-space: nowrap;
+                    ">鏌ョ湅鎷嗗寘閾�</button>
+                  </div>
+                </div>
+              </div>
+              
+              <div style="margin-bottom: 15px;">
+                <div style="display: flex; align-items: center; margin-bottom: 5px;">
+                  <span style="width: 100px; text-align: right; padding-right: 12px; color: #606266;">鐗╂枡缂栫爜:</span>
+                  <input type="text" id="${dialogId}-materiel" disabled style="
+                    flex: 1;
+                    padding: 8px 12px;
+                    border: 1px solid #dcdfe6;
+                    border-radius: 4px;
+                    background-color: #f5f7fa;
+                    color: #909399;
+                  ">
+                </div>
+              </div>
+              
+              <div style="margin-bottom: 15px;">
+                <div style="display: flex; align-items: center; margin-bottom: 5px;">
+                  <span style="width: 100px; text-align: right; padding-right: 12px; color: #606266;">鍓╀綑鏁伴噺:</span>
+                  <input type="text" id="${dialogId}-remain" disabled style="
+                    flex: 1;
+                    padding: 8px 12px;
+                    border: 1px solid #dcdfe6;
+                    border-radius: 4px;
+                    background-color: #f5f7fa;
+                    color: #909399;
+                  ">
+                </div>
+              </div>
+              
+              <div style="margin-bottom: 15px;">
+                <div style="display: flex; align-items: center; margin-bottom: 5px;">
+                  <span style="width: 100px; text-align: right; padding-right: 12px; color: #606266;">鎷嗗寘鏁伴噺:</span>
+                  <div style="flex: 1;">
+                    <input type="number" id="${dialogId}-splitQty" value="1" min="0.01" step="0.01" style="
+                      width: 100%;
+                      padding: 8px 12px;
+                      border: 1px solid #dcdfe6;
+                      border-radius: 4px;
+                    ">
+                  </div>
+                </div>
+              </div>
+            </div>
+            
+            <div class="custom-dialog-footer" style="
+              padding: 10px 20px 20px;
+              text-align: right;
+              border-top: 1px solid #ebeef5;
+            ">
+              <button id="${dialogId}-cancel" style="
+                padding: 9px 15px;
+                background: white;
+                color: #606266;
+                border: 1px solid #dcdfe6;
+                border-radius: 4px;
+                cursor: pointer;
+                margin-right: 10px;
+              ">鍙栨秷</button>
+              <button id="${dialogId}-confirm" style="
+                padding: 9px 15px;
+                background: #409eff;
+                color: white;
+                border: none;
+                border-radius: 4px;
+                cursor: pointer;
+              ">纭鎷嗗寘</button>
+            </div>
+          </div>
+        </div>
+      `;
+      
+      // 娣诲姞鏍峰紡
+      newDialog.style.cssText = `
+        position: fixed;
+        top: 0;
+        left: 0;
+        right: 0;
+        bottom: 0;
+        background: rgba(0,0,0,0.5);
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        z-index: 999999;
+      `;
+      
+      // 寮圭獥瀹瑰櫒鏍峰紡
+      const wrapper = newDialog.querySelector('.custom-dialog-wrapper');
+      if (wrapper) {
+        wrapper.style.position = 'relative';
+        wrapper.style.zIndex = '1000000';
+      }
+      
+      // 寮圭獥鍐呭鏍峰紡
+      const dialog = newDialog.querySelector('.custom-dialog');
+      if (dialog) {
+        dialog.style.background = 'white';
+        dialog.style.borderRadius = '4px';
+        dialog.style.maxWidth = '90vw';
+        dialog.style.maxHeight = '90vh';
+        dialog.style.boxShadow = '0 2px 12px 0 rgba(0, 0, 0, 0.1)';
+        dialog.style.overflow = 'auto';
+      }
+      
+      // 寮圭獥澶撮儴鏍峰紡
+      const header = newDialog.querySelector('.custom-dialog-header');
+      if (header) {
+        header.style.display = 'flex';
+        header.style.justifyContent = 'space-between';
+        header.style.alignItems = 'center';
+        header.style.padding = '20px 20px 10px';
+        header.style.borderBottom = '1px solid #ebeef5';
+      }
+      
+      document.body.appendChild(newDialog);
+      console.log('绱ф�ュ脊绐楀凡鍒涘缓');
+      
+      // 缁戝畾浜嬩欢
+      this.bindManualDialogEvents(dialogId);
+      
+      // 鑷姩鑱氱劍鍒版潯鐮佽緭鍏ユ
+      setTimeout(() => {
+        const barcodeInput = document.getElementById(`${dialogId}-barcode`);
+        if (barcodeInput) {
+          barcodeInput.focus();
+          // 娣诲姞鍥炶溅閿洃鍚�
+          barcodeInput.addEventListener('keyup', (event) => {
+            if (event.key === 'Enter') {
+              this.onManualSplitBarcodeScan(dialogId);
+            }
+          });
+        }
+      }, 100);
+    },
+    
+    // 缁戝畾鎵嬪姩寮圭獥浜嬩欢
+    bindManualDialogEvents(dialogId) {
+      const vm = this; // 淇濆瓨Vue瀹炰緥寮曠敤
+      
+      // 鏌ョ湅鎷嗗寘閾炬寜閽�
+      const viewChainBtn = document.getElementById(`${dialogId}-viewChain`);
+      if (viewChainBtn) {
+        viewChainBtn.onclick = () => {
+          const barcodeInput = document.getElementById(`${dialogId}-barcode`);
+          if (barcodeInput && barcodeInput.value.trim()) {
+            vm.viewSplitChainFromManualDialog(barcodeInput.value.trim(), dialogId);
+          } else {
+            ElMessage.warning('璇峰厛杈撳叆鏉$爜');
+          }
+        };
+      }
+      
+      // 鍙栨秷鎸夐挳
+      const cancelBtn = document.getElementById(`${dialogId}-cancel`);
+      if (cancelBtn) {
+        cancelBtn.onclick = () => {
+          const dialog = document.getElementById(dialogId);
+          if (dialog && dialog.parentNode) {
+            dialog.parentNode.removeChild(dialog);
+          }
+        };
+      }
+      
+      // 纭鎷嗗寘鎸夐挳
+      const confirmBtn = document.getElementById(`${dialogId}-confirm`);
+      if (confirmBtn) {
+        confirmBtn.onclick = () => {
+          vm.handleManualSplitPackage(dialogId);
+        };
+      }
+      
+      // 鏉$爜杈撳叆妗嗗彉鍖栦簨浠�
+      const barcodeInput = document.getElementById(`${dialogId}-barcode`);
+      if (barcodeInput) {
+        // 闃叉姈澶勭悊
+        let timeout;
+        barcodeInput.addEventListener('input', () => {
+          clearTimeout(timeout);
+          timeout = setTimeout(() => {
+            if (barcodeInput.value.trim()) {
+              vm.onManualSplitBarcodeScan(dialogId);
+            }
+          }, 500);
+        });
+      }
+    },
+    
+    // 鎵嬪姩寮圭獥鐨勬潯鐮佹壂鎻忓鐞�
+    async onManualSplitBarcodeScan(dialogId) {
+      const barcodeInput = document.getElementById(`${dialogId}-barcode`);
+      if (!barcodeInput || !barcodeInput.value.trim()) return;
+      
+      const barcode = barcodeInput.value.trim();
       
       try {
-        // 纭繚鍏抽棴鍏朵粬寮圭獥
-        this.closeAllDialogs();
-        
-        // 寤惰繜鎵撳紑锛岀‘淇滵OM鏇存柊瀹屾垚
-        this.$nextTick(() => {
-          this.showCustomSplitDialog = true;
-          this.resetSplitForm();
-          this.splitForm.orderNo = this.scanData.orderNo;
-          this.splitForm.palletCode = this.scanData.palletCode;
-          
-          // 纭繚杈撳叆妗嗚幏寰楃劍鐐�
-          this.$nextTick(() => {
-            const input = document.querySelector('#splitOriginalBarcode');
-            if (input) {
-              input.focus();
-            }
-            this.isDialogOpening = false;
-          });
+        const res = await http.post('/api/OutboundBatchPicking/split-package-info', {
+          orderNo: this.scanData.orderNo,
+          palletCode: this.scanData.palletCode,
+          barcode: barcode
         });
+
+        if (res.status) {
+          // 鏇存柊鐗╂枡缂栫爜
+          const materielInput = document.getElementById(`${dialogId}-materiel`);
+          if (materielInput) {
+            materielInput.value = res.data.materielCode || '';
+          }
+          
+          // 鏇存柊鍓╀綑鏁伴噺
+          const remainInput = document.getElementById(`${dialogId}-remain`);
+          if (remainInput) {
+            remainInput.value = res.data.remainQuantity || 0;
+          }
+          
+          // 鏇存柊鎷嗗寘鏁伴噺锛堥粯璁や负1锛屼笉瓒呰繃鍓╀綑鏁伴噺锛�
+          const splitQtyInput = document.getElementById(`${dialogId}-splitQty`);
+          if (splitQtyInput) {
+            const maxQty = res.data.remainQuantity || 0;
+            splitQtyInput.max = maxQty;
+            const currentVal = parseFloat(splitQtyInput.value) || 1;
+            if (currentVal > maxQty) {
+              splitQtyInput.value = Math.min(1, maxQty);
+            }
+          }
+        } else {
+          ElMessage.error(res.message || '鑾峰彇鎷嗗寘淇℃伅澶辫触');
+        }
       } catch (error) {
-        console.error('鎵撳紑鎷嗗寘寮圭獥澶辫触:', error);
-        this.isDialogOpening = false;
+        console.error('鑾峰彇鎷嗗寘淇℃伅澶辫触:', error);
+        ElMessage.error('鑾峰彇鎷嗗寘淇℃伅澶辫触');
       }
+    },
+    
+    // 浠庢墜鍔ㄥ脊绐楁煡鐪嬫媶鍖呴摼
+    viewSplitChainFromManualDialog(barcode, dialogId) {
+      // 鍏堝叧闂墜鍔ㄥ脊绐�
+      const dialog = document.getElementById(dialogId);
+      if (dialog && dialog.parentNode) {
+        dialog.parentNode.removeChild(dialog);
+      }
+      
+      // 寤惰繜涓�涓嬶紝鐒跺悗鎵撳紑Vue鐨勬媶鍖呴摼寮圭獥
+      setTimeout(() => {
+        this.viewSplitChain(barcode);
+      }, 50);
+    },
+    
+    // 澶勭悊鎵嬪姩寮圭獥鐨勬媶鍖呮搷浣�
+    async handleManualSplitPackage(dialogId) {
+      const barcodeInput = document.getElementById(`${dialogId}-barcode`);
+      const splitQtyInput = document.getElementById(`${dialogId}-splitQty`);
+      
+      if (!barcodeInput || !barcodeInput.value.trim()) {
+        ElMessage.warning('璇疯緭鍏ュ師鏉$爜');
+        return;
+      }
+      
+      if (!splitQtyInput || !splitQtyInput.value || parseFloat(splitQtyInput.value) <= 0) {
+        ElMessage.warning('璇疯緭鍏ユ湁鏁堢殑鎷嗗寘鏁伴噺');
+        return;
+      }
+      
+      const originalBarcode = barcodeInput.value.trim();
+      const splitQuantity = parseFloat(splitQtyInput.value);
+      
+      try {
+        // 鏄剧ず鍔犺浇鐘舵��
+        const confirmBtn = document.getElementById(`${dialogId}-confirm`);
+        if (confirmBtn) {
+          confirmBtn.disabled = true;
+          confirmBtn.textContent = '澶勭悊涓�...';
+        }
+        
+        const res = await http.post('/api/OutboundBatchPicking/split-package', {
+          orderNo: this.scanData.orderNo,
+          palletCode: this.scanData.palletCode,
+          originalBarcode: originalBarcode,
+          splitQuantity: splitQuantity
+        });
+        
+        if (res.status) {
+          ElMessage.success('鎷嗗寘鎴愬姛');
+          
+          // 鍏抽棴鎵嬪姩寮圭獥
+          const dialog = document.getElementById(dialogId);
+          if (dialog && dialog.parentNode) {
+            dialog.parentNode.removeChild(dialog);
+          }
+          
+          // 閲嶆柊鍔犺浇鏁版嵁
+          await this.loadPalletData();
+        } else {
+          ElMessage.error(res.message || '鎷嗗寘澶辫触');
+          
+          // 鎭㈠鎸夐挳鐘舵��
+          if (confirmBtn) {
+            confirmBtn.disabled = false;
+            confirmBtn.textContent = '纭鎷嗗寘';
+          }
+        }
+      } catch (error) {
+        console.error('鎷嗗寘澶辫触:', error);
+        ElMessage.error('鎷嗗寘澶辫触');
+        
+        // 鎭㈠鎸夐挳鐘舵��
+        const confirmBtn = document.getElementById(`${dialogId}-confirm`);
+        if (confirmBtn) {
+          confirmBtn.disabled = false;
+          confirmBtn.textContent = '纭鎷嗗寘';
+        }
+      }
+    },
+      closeAllDialogsImmediately() {
+      console.log('绔嬪嵆鍏抽棴鎵�鏈夊脊绐�');
+      
+      // 鐩存帴璁剧疆涓� false锛屼笉绛夊緟浠讳綍寮傛鎿嶄綔
+      this.showCustomSplitDialog = false;
+      this.showRevertSplitDialog = false;
+      this.showBatchReturnDialog = false;
+      this.showEmptyPalletDialog = false;
+      this.showSplitChainDialog = false;
+      
+      // 寮哄埗DOM鏇存柊
+      this.$forceUpdate();
     },
 
     async onSplitBarcodeScan() {
@@ -637,59 +1054,47 @@
 
     async handleSplitPackage() {
       if (this.$refs.splitFormRef) {
-        try {
-          const valid = await this.$refs.splitFormRef.validate();
-          if (!valid) return;
-          
-          this.splitLoading = true;
-          const res = await http.post('/api/OutboundBatchPicking/split-package', {
-            orderNo: this.splitForm.orderNo,
-            palletCode: this.splitForm.palletCode,
-            originalBarcode: this.splitForm.originalBarcode,
-            splitQuantity: this.splitForm.splitQuantity
-          });
-          
-          if (res.status) {
-            this.$message.success('鎷嗗寘鎴愬姛');
-            this.showCustomSplitDialog = false;
-            await this.loadPalletData();
-          } else {
-            this.$message.error(res.message || '鎷嗗寘澶辫触');
-          }
-        } catch (error) {
-          this.$message.error('鎷嗗寘澶辫触');
-        } finally {
-          this.splitLoading = false;
-        }
-      }
-    },
-
-    // 淇: 鎾ら攢鎷嗗寘寮圭獥
-    openRevertSplitDialog() {
-      if (this.isDialogOpening) return;
-      
-      this.isDialogOpening = true;
-      
-      try {
-        this.closeAllDialogs();
-        
-        this.$nextTick(() => {
-          this.showRevertSplitDialog = true;
-          this.revertSplitForm.newBarcode = '';
-          this.$nextTick(() => {
-            const input = document.querySelector('#revertSplitBarcode');
-            if (input) {
-              input.focus();
+        this.$refs.splitFormRef.validate(async (valid) => {
+          if (valid) {
+            this.splitLoading = true;
+            try {
+              const res = await http.post('/api/OutboundBatchPicking/split-package', {
+                orderNo: this.splitForm.orderNo,
+                palletCode: this.splitForm.palletCode,
+                originalBarcode: this.splitForm.originalBarcode,
+                splitQuantity: this.splitForm.splitQuantity
+              });
+              if (res.status) {
+                this.$message.success('鎷嗗寘鎴愬姛');
+                this.closeAllDialogs();
+                await this.loadPalletData();
+              } else {
+                this.$message.error(res.message || '鎷嗗寘澶辫触');
+              }
+            } catch (error) {
+              this.$message.error('鎷嗗寘澶辫触');
+            } finally {
+              this.splitLoading = false;
             }
-            this.isDialogOpening = false;
-          });
+          }
         });
-      } catch (error) {
-        console.error('鎵撳紑鎾ら攢鎷嗗寘寮圭獥澶辫触:', error);
-        this.isDialogOpening = false;
       }
     },
 
+    async viewSplitChainFromSplit(barcode) {
+      if (!barcode) {
+        this.$message.warning('璇峰厛杈撳叆鏉$爜');
+        return;
+      }
+      
+      this.closeAllDialogs();
+      
+      setTimeout(() => {
+        this.viewSplitChain(barcode);
+      }, 50);
+    },
+
+    // 鎾ら攢鎷嗗寘
     async onRevertSplitBarcodeScan() {
       if (!this.revertSplitForm.newBarcode) return;
       this.revertSplitForm.newBarcode = this.revertSplitForm.newBarcode.replace(/\n/g, '').trim();
@@ -697,41 +1102,59 @@
 
     async handleRevertSplit() {
       if (this.$refs.revertSplitFormRef) {
-        try {
-          const valid = await this.$refs.revertSplitFormRef.validate();
-          if (!valid) return;
-          
-          this.revertSplitLoading = true;
-          const res = await http.post('/api/OutboundBatchPicking/cancel-split', {
-            orderNo: this.scanData.orderNo,
-            palletCode: this.scanData.palletCode,
-            newBarcode: this.revertSplitForm.newBarcode
-          });
-          
-          if (res.status) {
-            this.$message.success('鎾ら攢鎷嗗寘鎴愬姛');
-            this.showRevertSplitDialog = false;
-            await this.loadPalletData();
-          } else {
-            this.$message.error(res.message || '鎾ら攢鎷嗗寘澶辫触');
+        this.$refs.revertSplitFormRef.validate(async (valid) => {
+          if (valid) {
+            this.revertSplitLoading = true;
+            try {
+              const res = await http.post('/api/OutboundBatchPicking/cancel-split', {
+                orderNo: this.scanData.orderNo,
+                palletCode: this.scanData.palletCode,
+                newBarcode: this.revertSplitForm.newBarcode
+              });
+              if (res.status) {
+                this.$message.success('鎾ら攢鎷嗗寘鎴愬姛');
+                this.closeAllDialogs();
+                await this.loadPalletData();
+              } else {
+                this.$message.error(res.message || '鎾ら攢鎷嗗寘澶辫触');
+              }
+            } catch (error) {
+              this.$message.error('鎾ら攢鎷嗗寘澶辫触');
+            } finally {
+              this.revertSplitLoading = false;
+            }
           }
-        } catch (error) {
-          this.$message.error('鎾ら攢鎷嗗寘澶辫触');
-        } finally {
-          this.revertSplitLoading = false;
-        }
+        });
       }
     },
 
-    // 淇: 鏌ョ湅鎷嗗寘閾�
+    async findRootChain(currentBarcode) {
+      this.splitChainLoading = true;
+      try {
+        const res = await http.post('/api/OutboundBatchPicking/find-root-split-chain', {
+          orderNo: this.scanData.orderNo,
+          barcode: currentBarcode
+        });
+        
+        if (res.status) {
+          this.splitChainInfo = res.data;
+          this.$message.success('宸插姞杞藉畬鏁存媶鍖呴摼');
+        } else {
+          this.$message.error(res.message || '鏌ユ壘瀹屾暣鎷嗗寘閾惧け璐�');
+        }
+      } catch (error) {
+        this.$message.error('鏌ユ壘瀹屾暣鎷嗗寘閾惧け璐�');
+      } finally {
+        this.splitChainLoading = false;
+      }
+    },
+
+    // 鏌ョ湅鎷嗗寘閾句俊鎭�
     async viewSplitChain(barcode) {
       if (!barcode) {
         this.$message.warning('璇峰厛杈撳叆鏉$爜');
         return;
       }
-      
-      if (this.isDialogOpening) return;
-      this.isDialogOpening = true;
       
       this.splitChainLoading = true;
       try {
@@ -742,35 +1165,28 @@
         
         if (res.status) {
           this.splitChainInfo = res.data;
-          
-          // 鍏抽棴鍏朵粬寮圭獥
-          this.closeAllDialogs();
-          
-          await this.$nextTick(() => {
-            this.showSplitChainDialog = true;
-            this.isDialogOpening = false;
-          });
+          this.activeDialog = 'splitChain';
         } else {
           this.$message.error(res.message || '鑾峰彇鎷嗗寘閾句俊鎭け璐�');
-          this.isDialogOpening = false;
         }
       } catch (error) {
         this.$message.error('鑾峰彇鎷嗗寘閾句俊鎭け璐�');
-        this.isDialogOpening = false;
       } finally {
         this.splitChainLoading = false;
       }
     },
 
-    // 淇: 鍏抽棴鎷嗗寘閾句俊鎭脊绐�
-    closeSplitChainDialog() {
+    // 鍏抽棴鎷嗗寘閾句俊鎭脊绐�
+     closeSplitChainDialog() {
       this.showSplitChainDialog = false;
     },
 
-    // 淇: 鍙栨秷鍗曚釜鎷嗗寘璁板綍
+    // 鍙栨秷鍗曚釜鎷嗗寘璁板綍
     async cancelSingleSplit(newBarcode) {
+      const originalBarcode = this.splitChainInfo.originalBarcode;
+      
       try {
-        await ElMessageBox.confirm(
+        await this.$confirm(
           `纭畾瑕佸彇娑堟潯鐮� ${newBarcode} 鐨勬媶鍖呮搷浣滃悧锛焋, 
           '鍙栨秷鍗曚釜鎷嗗寘', 
           {
@@ -791,11 +1207,10 @@
         if (res.status) {
           this.$message.success('鍙栨秷鎷嗗寘鎴愬姛');
           await this.loadPalletData();
-          
-          // 閲嶆柊鍔犺浇鎷嗗寘閾句俊鎭�
-          if (this.splitChainInfo.originalBarcode) {
-            await this.viewSplitChain(this.splitChainInfo.originalBarcode);
-          }
+          this.closeAllDialogs();
+          setTimeout(() => {
+            this.viewSplitChain(originalBarcode);
+          }, 50);
         } else {
           this.$message.error(res.message || '鍙栨秷鎷嗗寘澶辫触');
         }
@@ -808,16 +1223,18 @@
       }
     },
 
-    // 淇: 鍙栨秷鏁翠釜鎷嗗寘閾�  
+    // 鍙栨秷鏁翠釜鎷嗗寘閾�  
     async cancelWholeSplitChain() {
       try {
-        await ElMessageBox.confirm(
+        await this.$confirm(
           `纭畾瑕佸彇娑堟暣涓媶鍖呴摼鍚楋紵\n杩欏皢鍙栨秷浠庢潯鐮� ${this.splitChainInfo.originalBarcode} 寮�濮嬬殑鎵�鏈夋媶鍖呮搷浣溿�俙, 
           '鍙栨秷鎷嗗寘閾剧‘璁�', 
           {
             confirmButtonText: '纭畾鍙栨秷',
             cancelButtonText: '鍐嶆兂鎯�',
-            type: 'warning'
+            type: 'warning',
+            center: true,
+            closeOnClickModal: false
           }
         );
         
@@ -831,14 +1248,14 @@
         
         if (res.status) {
           this.$message.success('鍙栨秷鎷嗗寘閾炬垚鍔�');
-          this.closeSplitChainDialog();
+          this.closeAllDialogs();
           await this.loadPalletData();
         } else {
           this.$message.error(res.message || '鍙栨秷鎷嗗寘閾惧け璐�');
         }
       } catch (error) {
         if (error !== 'cancel') {
-          this.$message.error('鍙栨秷鎷嗗寘閾惧け璐�');
+          this.$message.error('鍙栨秷鎷嗗寘閾惧け璐�: ' + error.message);
         }
       } finally {
         this.revertSplitLoading = false;
@@ -857,13 +1274,30 @@
       return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
     },
 
-    // 淇: 鏂板鍏抽棴鎵�鏈夊脊绐楃殑鏂规硶
+    // 鍏抽敭淇锛氭柊澧炲叧闂墍鏈夊脊绐楃殑鏂规硶
     closeAllDialogs() {
+      this.activeDialog = null;
+      // 纭繚鎵�鏈夊脊绐楃姸鎬侀兘琚噸缃�
+// 鍏抽棴Vue寮圭獥
       this.showCustomSplitDialog = false;
       this.showRevertSplitDialog = false;
-      this.showSplitChainDialog = false;
       this.showBatchReturnDialog = false;
       this.showEmptyPalletDialog = false;
+      this.showSplitChainDialog = false;
+      
+      // 鍏抽棴鎵嬪姩寮圭獥
+      if (this.manualDialog && this.manualDialog.parentNode) {
+        this.manualDialog.parentNode.removeChild(this.manualDialog);
+        this.manualDialog = null;
+      }
+      
+      // 绉婚櫎鎵�鏈夌揣鎬ュ脊绐�
+      const emergencyDialogs = document.querySelectorAll('.emergency-fix');
+      emergencyDialogs.forEach(dialog => {
+        if (dialog.parentNode) {
+          dialog.parentNode.removeChild(dialog);
+        }
+      });
     },
 
     // 鍥炲簱鐩稿叧鏂规硶
@@ -873,15 +1307,25 @@
         return;
       }
       
-      this.closeAllDialogs();
+      if (this.isOpeningDialog) return;
       
-      this.$nextTick(() => {
-        this.showBatchReturnDialog = true;
-        this.batchReturnForm.orderNo = this.scanData.orderNo;
-        this.batchReturnForm.palletCode = this.scanData.palletCode;
-        this.batchReturnForm.unpickedCount = this.summary.unpickedCount;
-        this.batchReturnForm.unpickedQuantity = this.summary.unpickedQuantity;
-      });
+      this.isOpeningDialog = true;
+      
+      setTimeout(() => {
+        this.closeAllDialogsImmediately();
+        
+        requestAnimationFrame(() => {
+          this.showBatchReturnDialog = true;
+          this.batchReturnForm.orderNo = this.scanData.orderNo;
+          this.batchReturnForm.palletCode = this.scanData.palletCode;
+          this.batchReturnForm.unpickedCount = this.summary.unpickedCount;
+          this.batchReturnForm.unpickedQuantity = this.summary.unpickedQuantity;
+          
+          this.$nextTick(() => {
+            this.isOpeningDialog = false;
+          });
+        });
+      }, 0);
     },
 
     async handleBatchReturnConfirm() {
@@ -893,7 +1337,7 @@
         });
         if (res.status) {
           this.$message.success('鍥炲簱鎴愬姛');
-          this.showBatchReturnDialog = false;
+          this.closeAllDialogs();
           await this.loadPalletData();
         } else {
           this.$message.error(res.message || '鍥炲簱澶辫触');
@@ -906,14 +1350,24 @@
     },
 
     // 鍙栫┖绠辨柟娉�
-    handleEmptyPallet() {
-      this.closeAllDialogs();
+handleEmptyPallet() {
+      if (this.isOpeningDialog) return;
       
-      this.$nextTick(() => {
-        this.showEmptyPalletDialog = true;
-        this.emptypalletOutForm.orderNo = this.scanData.orderNo;
-        this.emptypalletOutForm.palletCode = '';
-      });
+      this.isOpeningDialog = true;
+      
+      setTimeout(() => {
+        this.closeAllDialogsImmediately();
+        
+        requestAnimationFrame(() => {
+          this.showEmptyPalletDialog = true;
+          this.emptypalletOutForm.orderNo = this.scanData.orderNo;
+          this.emptypalletOutForm.palletCode = '';
+          
+          this.$nextTick(() => {
+            this.isOpeningDialog = false;
+          });
+        });
+      }, 0);
     },
 
     async handleEmptyPalletConfirm() {
@@ -925,7 +1379,7 @@
         });
         if (res.status) {
           this.$message.success('鍙栬蛋绌虹鎴愬姛');
-          this.showEmptyPalletDialog = false;
+          this.closeAllDialogs();
           await this.loadPalletData();
         } else {
           this.$message.error(res.message || '鍙栬蛋绌虹澶辫触');
@@ -942,11 +1396,9 @@
       if (!this.scanData.orderNo || !this.scanData.palletCode) return;
       
       try {
-        await Promise.all([
-          this.loadUnpickedList(),
-          this.loadPickedList(),
-          this.loadPalletStatus()
-        ]);
+        await this.loadUnpickedList();
+        await this.loadPickedList();
+        await this.loadPalletStatus();
       } catch (error) {
         console.error('鍔犺浇鎵樼洏鏁版嵁澶辫触:', error);
       }
@@ -964,7 +1416,6 @@
           this.summary.unpickedQuantity = this.unpickedList.reduce((sum, item) => sum + (item.remainQuantity || 0), 0);
         }
       } catch (error) {
-        console.error('鍔犺浇鏈嫞閫夊垪琛ㄥけ璐�:', error);
         this.$message.error('鍔犺浇鏈嫞閫夊垪琛ㄥけ璐�');
       }
     },
@@ -983,7 +1434,6 @@
           this.summary.pickedCount = this.pickedList.length;
         }
       } catch (error) {
-        console.error('鍔犺浇宸叉嫞閫夊垪琛ㄥけ璐�:', error);
         this.$message.error('鍔犺浇宸叉嫞閫夊垪琛ㄥけ璐�');
       }
     },
@@ -998,7 +1448,6 @@
           this.palletStatus = res.data.statusText || '鏈煡';
         }
       } catch (error) {
-        console.error('鍔犺浇鎵樼洏鐘舵�佸け璐�:', error);
         this.palletStatus = '鏈煡';
       }
     },
@@ -1043,39 +1492,33 @@
         return;
       }
 
-      try {
-        await ElMessageBox.confirm(
-          `纭畾瑕佸彇娑堥�変腑鐨� ${this.selectedPickedRows.length} 椤瑰悧锛焋, 
-          '鎻愮ず', 
-          {
-            confirmButtonText: '纭畾',
-            cancelButtonText: '鍙栨秷',
-            type: 'warning'
-          }
-        );
-        
-        for (const row of this.selectedPickedRows) {
-          try {
-            const res = await http.post('/api/OutboundBatchPicking/cancel-picking', {
-              orderNo: this.scanData.orderNo,
-              palletCode: this.scanData.palletCode,
-              barcode: row.currentBarcode
-            });
-            if (!res.status) {
-              this.$message.warning(`鍙栨秷鎷i�夊け璐�: ${row.currentBarcode} - ${res.message}`);
+      this.$confirm(`纭畾瑕佸彇娑堥�変腑鐨� ${this.selectedPickedRows.length} 椤瑰悧锛焋, '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(async () => {
+        try {
+          for (const row of this.selectedPickedRows) {
+            try {
+              const res = await http.post('/api/OutboundBatchPicking/cancel-picking', {
+                orderNo: this.scanData.orderNo,
+                palletCode: this.scanData.palletCode,
+                barcode: row.currentBarcode
+              });
+              if (!res.status) {
+                this.$message.warning(`鍙栨秷鎷i�夊け璐�: ${row.currentBarcode} - ${res.message}`);
+              }
+            } catch (error) {
+              this.$message.warning(`鍙栨秷鎷i�夊け璐�: ${row.currentBarcode} - ${error.message}`);
             }
-          } catch (error) {
-            this.$message.warning(`鍙栨秷鎷i�夊け璐�: ${row.currentBarcode} - ${error.message}`);
-          }
-        }        
-        this.$message.success('鎵归噺鍙栨秷瀹屾垚');
-        await this.loadPalletData();
-        this.selectedPickedRows = [];
-      } catch (error) {
-        if (error !== 'cancel') {
+          }        
+          this.$message.success('鎵归噺鍙栨秷瀹屾垚');
+          await this.loadPalletData();
+          this.selectedPickedRows = [];
+        } catch (error) {
           this.$message.error('鎵归噺鍙栨秷鎿嶄綔澶辫触');
         }
-      }
+      });
     },
 
     // 閲嶇疆鏂规硶
@@ -1091,12 +1534,31 @@
       this.resetSplitForm();
     },
 
-    closeRevertSplitDialog() {
+openRevertSplitDialog() {
+      if (this.isOpeningDialog) return;
+      
+      this.isOpeningDialog = true;
+      
+      setTimeout(() => {
+        this.closeAllDialogsImmediately();
+        
+        requestAnimationFrame(() => {
+          this.showRevertSplitDialog = true;
+          this.revertSplitForm.newBarcode = '';
+          
+          this.$nextTick(() => {
+            this.isOpeningDialog = false;
+          });
+        });
+      }, 0);
+    },
+
+  closeRevertSplitDialog() {
       this.showRevertSplitDialog = false;
       this.revertSplitForm.newBarcode = '';
     },
 
-    closeBatchReturnDialog() {
+ closeBatchReturnDialog() {
       this.showBatchReturnDialog = false;
     },
 
@@ -1105,7 +1567,7 @@
       this.emptypalletOutForm.palletCode = this.emptypalletOutForm.palletCode.replace(/\n/g, '').trim();
     },
 
-    closeEmptyPalletDialog() {
+     closeEmptyPalletDialog() {
       this.showEmptyPalletDialog = false;
       this.emptypalletOutForm.palletCode = '';
     },
@@ -1152,7 +1614,7 @@
   color: #909399;
 }
 
-/* 鑷畾涔夊脊绐楁牱寮� - 鍏抽敭淇: 绉婚櫎鍙兘瀵艰嚧鍐茬獊鐨剒-index瑙勫垯 */
+/* 鑷畾涔夊脊绐楁牱寮� - 鍏抽敭淇 */
 .custom-dialog-overlay {
   position: fixed;
   top: 0;
@@ -1163,11 +1625,12 @@
   display: flex;
   align-items: center;
   justify-content: center;
-  /* 绉婚櫎杩欓噷鐨剒-index锛屽湪妯℃澘涓崟鐙缃� */
+  z-index: 9999; /* 鎻愰珮z-index纭繚鍦ㄦ渶涓婂眰 */
 }
 
 .custom-dialog-wrapper {
   position: relative;
+  z-index: 10000;
 }
 
 .custom-dialog {
@@ -1238,4 +1701,140 @@
     width: 100%;
   }
 }
+
+/* 鍘熸湁鐨勬牱寮忎繚鎸佷笉鍙� */
+.OutboundPicking-container {
+  padding: 20px;
+}
+
+.scanner-form {
+  display: flex;
+  gap: 10px;
+  align-items: center;
+  flex-wrap: wrap;
+}
+
+.scanner-form .el-input {
+  width: 200px;
+}
+
+.summary-info {
+  display: flex;
+  gap: 20px;
+  flex-wrap: wrap;
+}
+
+.table-actions {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 10px;
+  padding: 0 10px;
+}
+
+.selection-count {
+  font-size: 12px;
+  color: #909399;
+}
+
+/* 鍘熸湁鐨勮嚜瀹氫箟寮圭獥鏍峰紡 */
+.custom-dialog-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 2000;
+}
+
+.custom-dialog-wrapper {
+  position: relative;
+  z-index: 2001;
+}
+
+.custom-dialog {
+  background: white;
+  border-radius: 4px;
+  width: 500px;
+  max-width: 90vw;
+  max-height: 90vh;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  overflow: auto;
+}
+
+.custom-dialog-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 20px 20px 10px;
+  border-bottom: 1px solid #ebeef5;
+}
+
+.custom-dialog-header h3 {
+  margin: 0;
+  color: #303133;
+}
+
+.close-button {
+  font-size: 18px;
+  color: #909399;
+  padding: 0;
+  width: 24px;
+  height: 24px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.close-button:hover {
+  color: #409EFF;
+  background-color: transparent;
+}
+
+.custom-dialog-body {
+  padding: 20px;
+}
+
+.custom-dialog-footer {
+  padding: 10px 20px 20px;
+  text-align: right;
+  border-top: 1px solid #ebeef5;
+}
+
+.custom-dialog-footer .el-button {
+  margin-left: 10px;
+}
+
+@media (max-width: 768px) {
+  .custom-dialog {
+    width: 95vw;
+    margin: 10px;
+  }
+  
+  .scanner-form {
+    flex-direction: column;
+    align-items: stretch;
+  }
+  
+  .scanner-form .el-input {
+    width: 100%;
+  }
+}
+
+/* 鏂板锛氭墜鍔ㄥ脊绐楃殑鎸夐挳鎮仠鏁堟灉 */
+:deep(button) {
+  transition: all 0.3s;
+}
+
+:deep(button:hover) {
+  opacity: 0.8;
+}
+
+:deep(button:active) {
+  opacity: 0.6;
+}
 </style>
\ No newline at end of file

--
Gitblit v1.9.3