From d3f479a5e246d808688f85ca0b59e86c92621dbf Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期二, 10 二月 2026 14:38:50 +0800
Subject: [PATCH] 标签浮点处理

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java |   17 +++--
 rsf-admin/src/layout/TabsBar.jsx                                                              |  124 +++++++++++++++++++++++++----------------
 2 files changed, 86 insertions(+), 55 deletions(-)

diff --git a/rsf-admin/src/layout/TabsBar.jsx b/rsf-admin/src/layout/TabsBar.jsx
index 6ffa4c4..cf1d663 100644
--- a/rsf-admin/src/layout/TabsBar.jsx
+++ b/rsf-admin/src/layout/TabsBar.jsx
@@ -275,47 +275,47 @@
         setContextMenuTab(null);
     };
 
-    // 鍏抽棴宸︿晶鏍囩椤碉紙淇濈暀鎸囧畾鏍囩椤靛強鍏跺彸渚х殑鎵�鏈夋爣绛鹃〉锛�
-    // const handleCloseLeft = (keepTabPath) => {
-    //     const keepTabIndex = tabs.findIndex(tab => tab.path === keepTabPath);
-    //     if (keepTabIndex < 0) {
-    //         return;
-    //     }
+    //鍏抽棴宸︿晶鏍囩椤碉紙淇濈暀鎸囧畾鏍囩椤靛強鍏跺彸渚х殑鎵�鏈夋爣绛鹃〉锛�
+    const handleCloseLeft = (keepTabPath) => {
+        const keepTabIndex = tabs.findIndex(tab => tab.path === keepTabPath);
+        if (keepTabIndex < 0) {
+            return;
+        }
 
-    //     // 淇濈暀鎸囧畾鏍囩椤靛強鍏跺彸渚х殑鎵�鏈夋爣绛鹃〉
-    //     const newTabs = tabs.slice(keepTabIndex);
+        // 淇濈暀鎸囧畾鏍囩椤靛強鍏跺彸渚х殑鎵�鏈夋爣绛鹃〉
+        const newTabs = tabs.slice(keepTabIndex);
 
-    //     // 纭繚dashboard濮嬬粓鍦ㄧ涓�浣嶏紙濡傛灉瀛樺湪锛�
-    //     const dashboardTab = newTabs.find(tab => tab.path === '/dashboard');
-    //     if (dashboardTab && newTabs[0].path !== '/dashboard') {
-    //         const dashboardIndex = newTabs.findIndex(tab => tab.path === '/dashboard');
-    //         if (dashboardIndex > 0) {
-    //             newTabs.splice(dashboardIndex, 1);
-    //             newTabs.unshift(dashboardTab);
-    //         }
-    //     }
+        // 纭繚dashboard濮嬬粓鍦ㄧ涓�浣嶏紙濡傛灉瀛樺湪锛�
+        const dashboardTab = newTabs.find(tab => tab.path === '/dashboard');
+        if (dashboardTab && newTabs[0].path !== '/dashboard') {
+            const dashboardIndex = newTabs.findIndex(tab => tab.path === '/dashboard');
+            if (dashboardIndex > 0) {
+                newTabs.splice(dashboardIndex, 1);
+                newTabs.unshift(dashboardTab);
+            }
+        }
 
-    //     saveTabs(newTabs);
-    //     setTabs(newTabs);
-    //     setContextMenu(null);
-    //     setContextMenuTab(null);
-    // };
+        saveTabs(newTabs);
+        setTabs(newTabs);
+        setContextMenu(null);
+        setContextMenuTab(null);
+    };
 
     // 鍏抽棴鍙充晶鏍囩椤碉紙淇濈暀鎸囧畾鏍囩椤靛強鍏跺乏渚х殑鎵�鏈夋爣绛鹃〉锛�
-    // const handleCloseRight = (keepTabPath) => {
-    //     const keepTabIndex = tabs.findIndex(tab => tab.path === keepTabPath);
-    //     if (keepTabIndex < 0) {
-    //         return;
-    //     }
+    const handleCloseRight = (keepTabPath) => {
+        const keepTabIndex = tabs.findIndex(tab => tab.path === keepTabPath);
+        if (keepTabIndex < 0) {
+            return;
+        }
 
-    //     // 淇濈暀鎸囧畾鏍囩椤靛強鍏跺乏渚х殑鎵�鏈夋爣绛鹃〉
-    //     const newTabs = tabs.slice(0, keepTabIndex + 1);
+        // 淇濈暀鎸囧畾鏍囩椤靛強鍏跺乏渚х殑鎵�鏈夋爣绛鹃〉
+        const newTabs = tabs.slice(0, keepTabIndex + 1);
 
-    //     saveTabs(newTabs);
-    //     setTabs(newTabs);
-    //     setContextMenu(null);
-    //     setContextMenuTab(null);
-    // };
+        saveTabs(newTabs);
+        setTabs(newTabs);
+        setContextMenu(null);
+        setContextMenuTab(null);
+    };
 
     // 澶勭悊鍙抽敭鑿滃崟
     const handleContextMenu = (event, tab) => {
@@ -373,18 +373,18 @@
     };
 
     // 鍙抽敭鑿滃崟锛氬叧闂乏渚ф爣绛�
-    // const handleCloseLeftTabs = () => {
-    //     if (contextMenuTab) {
-    //         handleCloseLeft(contextMenuTab.path);
-    //     }
-    // };
+    const handleCloseLeftTabs = () => {
+        if (contextMenuTab) {
+            handleCloseLeft(contextMenuTab.path);
+        }
+    };
 
     // 鍙抽敭鑿滃崟锛氬叧闂彸渚ф爣绛�
-    // const handleCloseRightTabs = () => {
-    //     if (contextMenuTab) {
-    //         handleCloseRight(contextMenuTab.path);
-    //     }
-    // };
+    const handleCloseRightTabs = () => {
+        if (contextMenuTab) {
+            handleCloseRight(contextMenuTab.path);
+        }
+    };
 
 
     // 鑾峰彇褰撳墠鏍囩椤电储寮�
@@ -549,13 +549,33 @@
                         ? { top: contextMenu.mouseY, left: contextMenu.mouseX }
                         : undefined
                 }
+                PaperProps={{
+                    sx: {
+                        minWidth: 120,
+                        borderRadius: '8px',
+                        boxShadow: '0 4px 20px rgba(0,0,0,0.08)',
+                        mt: 0.5,
+                        py: 0.5,
+                    },
+                }}
+                MenuListProps={{
+                    sx: { py: 0 },
+                }}
             >
                 {contextMenuTab && contextMenuTab.closable && (
-                    <MenuItem onClick={handleCloseCurrentTab}>
+                    <MenuItem
+                        onClick={handleCloseCurrentTab}
+                        sx={{
+                            fontSize: '0.8125rem',
+                            py: 0.75,
+                            px: 1.5,
+                            minHeight: 'auto',
+                        }}
+                    >
                         {t('ra.action.close', '鍏抽棴褰撳墠鏍囩')}
                     </MenuItem>
                 )}
-                {/* {contextMenuTab && canCloseLeftForTab(contextMenuTab.path) && (
+                {contextMenuTab && canCloseLeftForTab(contextMenuTab.path) && (
                     <MenuItem onClick={handleCloseLeftTabs}>
                         {t('ra.action.closeLeft', '鍏抽棴宸︿晶鏍囩')}
                     </MenuItem>
@@ -564,9 +584,17 @@
                     <MenuItem onClick={handleCloseRightTabs}>
                         {t('ra.action.closeRight', '鍏抽棴鍙充晶鏍囩')}
                     </MenuItem>
-                )} */}
+                )}
                 {contextMenuTab && canCloseOthersForTab(contextMenuTab.path) && (
-                    <MenuItem onClick={handleCloseOtherTabs}>
+                    <MenuItem
+                        onClick={handleCloseOtherTabs}
+                        sx={{
+                            fontSize: '0.8125rem',
+                            py: 0.75,
+                            px: 1.5,
+                            minHeight: 'auto',
+                        }}
+                    >
                         {t('ra.action.closeOthers', '鍏抽棴鍏朵粬鏍囩')}
                     </MenuItem>
                 )}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index 9da1c20..2bc9667 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -29,6 +29,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -47,6 +48,8 @@
 
     public Logger logger = LoggerFactory.getLogger(this.getClass());
 
+    /** 鍑哄簱鍓╀綑閲忓宸細灏忎簬绛変簬姝ゅ�艰涓哄凡鍒嗛厤瀹岋紝閬垮厤娴偣璇樊浜х敓澶氫綑鈥滃簱瀛樹笉瓒斥�濊 */
+    private static final BigDecimal ISSUED_TOLERANCE = new BigDecimal("0.000001");
 
     @Autowired
     private AsnOrderItemService asnOrderItemService;
@@ -681,9 +684,8 @@
         Set<ExistDto> existDtos = new HashSet<>();
         for (WkOrderItem wkOrderItem : wkOrderItems) {
             BigDecimal issued = new BigDecimal(wkOrderItem.getAnfme().toString())
-                    .subtract(new BigDecimal(wkOrderItem.getWorkQty().toString())
-                    );
-            if (issued.doubleValue() <= 0) {
+                    .subtract(new BigDecimal(wkOrderItem.getWorkQty().toString()));
+            if (issued.compareTo(ISSUED_TOLERANCE) <= 0) {
                 continue;
             }
             List<LocItem> locItems = new ArrayList<>();
@@ -697,7 +699,7 @@
             for (LocItem locItem : locItems) {
                 Loc loc = locService.getById(locItem.getLocId());
                 List<LocItem> itemList = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locItem.getLocCode()));
-                if (issued.doubleValue() > 0) {
+                if (issued.compareTo(ISSUED_TOLERANCE) > 0) {
                     ExistDto existDto = new ExistDto().setBatch(locItem.getBatch()).setMatnr(locItem.getMatnrCode()).setLocNo(locItem.getLocCode());
                     if (existDtos.add(existDto)) {
                         locItem.setOutQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue());
@@ -730,14 +732,15 @@
                     }
                 }
             }
-            if (issued.doubleValue() > 0) {
+            if (issued.compareTo(ISSUED_TOLERANCE) > 0) {
+                double remaining = issued.setScale(6, RoundingMode.HALF_UP).doubleValue();
                 LocItem locItem = new LocItem()
                         .setId(new Random().nextLong())
                         .setMatnrCode(wkOrderItem.getMatnrCode())
                         .setMaktx(wkOrderItem.getMaktx())
                         .setAnfme(0.00)
-                        .setWorkQty(issued.doubleValue())
-                        .setOutQty(issued.doubleValue())
+                        .setWorkQty(remaining)
+                        .setOutQty(remaining)
                         .setUnit(wkOrderItem.getStockUnit())
                         .setBatch(wkOrderItem.getSplrBatch());
                 OrderOutItemDto orderOutItemDto = new OrderOutItemDto();

--
Gitblit v1.9.1