From a9fadfc08caca9bb83d76303b70665e6ca0e30c3 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 6 Feb 2026 04:00:06 +0000 Subject: [PATCH] fix: improve batch tunnel migration and simplify batch action labels --- .sisyphus/ralph-loop.local.md | 9 ------ .../service/impl/ForwardServiceImpl.java | 30 ++++++++++++++++++- vite-frontend/src/pages/forward.tsx | 26 ++++++++-------- vite-frontend/src/pages/node.tsx | 8 ++--- vite-frontend/src/pages/tunnel.tsx | 18 +++++------ 5 files changed, 55 insertions(+), 36 deletions(-) delete mode 100644 .sisyphus/ralph-loop.local.md diff --git a/.sisyphus/ralph-loop.local.md b/.sisyphus/ralph-loop.local.md deleted file mode 100644 index 506653a..0000000 --- a/.sisyphus/ralph-loop.local.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -active: true -iteration: 1 -max_iterations: 100 -completion_promise: "DONE" -started_at: "2026-01-24T05:20:50.887Z" -session_id: "ses_41192b7d7ffewFHxf1dDS7ESHO" ---- -Complete the task as instructed diff --git a/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java index d57426c..d9f42a0 100644 --- a/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java +++ b/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java @@ -1384,6 +1384,15 @@ public class ForwardServiceImpl extends ServiceImpl impl result.addFailedItem(forwardId, "已是目标隧道"); continue; } + + List existingForwardPorts = forwardPortService.list( + new QueryWrapper().eq("forward_id", forwardId).orderByAsc("id") + ); + Integer originalInPort = existingForwardPorts.stream() + .map(ForwardPort::getPort) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); Tunnel oldTunnel = validateTunnel(forward.getTunnelId()); if (oldTunnel != null) { @@ -1424,7 +1433,7 @@ public class ForwardServiceImpl extends ServiceImpl impl List newChainTunnels = chainTunnelService.list( new QueryWrapper().eq("tunnel_id", targetTunnel.getId()).eq("chain_type", 1) ); - List chainTunnelsWithPort = get_port(newChainTunnels, null, forwardId); + List chainTunnelsWithPort = allocatePortsForBatchTunnelChange(newChainTunnels, originalInPort, forwardId); for (ChainTunnel chainTunnel : chainTunnelsWithPort) { ForwardPort forwardPort = new ForwardPort(); @@ -1450,4 +1459,23 @@ public class ForwardServiceImpl extends ServiceImpl impl return R.ok(result); } + private List allocatePortsForBatchTunnelChange(List newChainTunnels, Integer originalInPort, Long forwardId) { + if (originalInPort == null) { + return get_port(newChainTunnels, null, forwardId); + } + + try { + return get_port(newChainTunnels, originalInPort, forwardId); + } catch (RuntimeException originalPortError) { + try { + return get_port(newChainTunnels, null, forwardId); + } catch (RuntimeException autoAllocateError) { + throw new RuntimeException( + "原入口端口 " + originalInPort + " 在目标隧道不可用,自动分配新端口也失败: " + autoAllocateError.getMessage(), + autoAllocateError + ); + } + } + } + } diff --git a/vite-frontend/src/pages/forward.tsx b/vite-frontend/src/pages/forward.tsx index f549ba2..a351e96 100644 --- a/vite-frontend/src/pages/forward.tsx +++ b/vite-frontend/src/pages/forward.tsx @@ -1315,10 +1315,10 @@ export default function ForwardPage() { setBatchDeleteModalOpen(false); loadData(false); } else { - toast.error(res.msg || "批量删除失败"); + toast.error(res.msg || "删除失败"); } } catch (e: any) { - toast.error(e.message || "批量删除失败"); + toast.error(e.message || "删除失败"); } finally { setBatchLoading(false); } @@ -1340,10 +1340,10 @@ export default function ForwardPage() { setSelectMode(false); loadData(false); } else { - toast.error(res.msg || "批量重新下发失败"); + toast.error(res.msg || "下发失败"); } } catch (e: any) { - toast.error(e.message || "批量重新下发失败"); + toast.error(e.message || "下发失败"); } finally { setBatchLoading(false); } @@ -1370,10 +1370,10 @@ export default function ForwardPage() { setBatchTargetTunnelId(null); loadData(false); } else { - toast.error(res.msg || "批量换隧道失败"); + toast.error(res.msg || "隧道失败"); } } catch (e: any) { - toast.error(e.message || "批量换隧道失败"); + toast.error(e.message || "隧道失败"); } finally { setBatchLoading(false); } @@ -1786,7 +1786,7 @@ export default function ForwardPage() { color={selectMode ? "warning" : "default"} onPress={toggleSelectMode} > - {selectMode ? "退出选择" : "批量操作"} + {selectMode ? "退出" : "批量"} )} @@ -3069,7 +3069,7 @@ export default function ForwardPage() { {(onClose) => ( <> - 确认批量删除 + 确认删除

确定要删除选中的 {selectedIds.size} 项转发吗?此操作不可撤销。

@@ -3095,7 +3095,7 @@ export default function ForwardPage() { {(onClose) => ( <> - 批量换隧道 + 隧道

将选中的 {selectedIds.size} 项转发迁移到新隧道: