From fbc5554c6a97ea5437097a32723e697917ec5b70 Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Wed, 15 Jul 2026 18:14:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端新增 /rpc-api/base/code-gen/preview 接口 - SequenceAllocator.preview 查询序号但不消耗 - 前端操作列新增预览按钮,弹窗展示下一个编码 --- .../module/base/api/codegen/CodeGenApi.java | 6 +++ .../controller/api/CodeGenController.java | 9 ++++ .../base/service/codegen/CodeGenService.java | 8 +++ .../service/codegen/CodeGenServiceImpl.java | 32 ++++++++++++ .../service/codegen/SequenceAllocator.java | 15 ++++++ .../src/api/base/codegen/index.ts | 8 +++ .../src/views/base/codegen/index.vue | 50 +++++++++++++++++-- 7 files changed, 125 insertions(+), 3 deletions(-) diff --git a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/codegen/CodeGenApi.java b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/codegen/CodeGenApi.java index b6a77556..6ac04ef9 100644 --- a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/codegen/CodeGenApi.java +++ b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/codegen/CodeGenApi.java @@ -9,6 +9,8 @@ import jakarta.validation.Valid; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; /** * RPC 服务 - 编码生成 @@ -31,4 +33,8 @@ public interface CodeGenApi { @Operation(summary = "生成编码") CommonResult generate(@Valid @RequestBody CodeGenerateReqDTO reqDTO); + @GetMapping(PREFIX + "/preview") + @Operation(summary = "预览下一个编码(不消耗序号)") + CommonResult preview(@RequestParam("ruleCode") String ruleCode); + } diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/api/CodeGenController.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/api/CodeGenController.java index 17cb8e52..8cb27cb1 100644 --- a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/api/CodeGenController.java +++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/api/CodeGenController.java @@ -8,9 +8,11 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import static cn.code.nl.framework.common.pojo.CommonResult.success; @@ -39,4 +41,11 @@ public class CodeGenController { return success(code); } + @GetMapping("/preview") + @Operation(summary = "预览下一个编码(不消耗序号)") + public CommonResult preview(@RequestParam("ruleCode") String ruleCode) { + String code = codeGenService.preview(ruleCode); + return success(code); + } + } diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenService.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenService.java index d300a70c..57fe3c1a 100644 --- a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenService.java +++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenService.java @@ -15,4 +15,12 @@ public interface CodeGenService { */ String generate(String ruleCode); + /** + * 预览下一个编码(不消耗序号) + * + * @param ruleCode 规则编码 + * @return 预览的编码 + */ + String preview(String ruleCode); + } diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenServiceImpl.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenServiceImpl.java index 4d2623e7..95be27d0 100644 --- a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenServiceImpl.java +++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/CodeGenServiceImpl.java @@ -54,6 +54,26 @@ public class CodeGenServiceImpl implements CodeGenService { return postProcess(sb.toString(), rule); } + @Override + public String preview(String ruleCode) { + // 1. 获取规则配置 + CodeRuleDO rule = codeRuleService.getRuleByCode(ruleCode); + + // 2. 遍历分段,SEQUENCE 段用 preview(不消耗序号) + List segments = rule.getSegmentConfig(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < segments.size(); i++) { + String segmentValue = buildPreviewSegment(rule, segments.get(i)); + sb.append(segmentValue); + if (i < segments.size() - 1 && StrUtil.isNotBlank(rule.getSeparator())) { + sb.append(rule.getSeparator()); + } + } + + // 3. 后处理 + return postProcess(sb.toString(), rule); + } + /** * 根据段类型分发处理,生成段值 */ @@ -66,6 +86,18 @@ public class CodeGenServiceImpl implements CodeGenService { }; } + /** + * 预览模式分发(SEQUENCE 段不消耗序号) + */ + private String buildPreviewSegment(CodeRuleDO rule, SegmentConfig segment) { + return switch (segment.getType()) { + case "PREFIX" -> buildPrefixSegment(segment); + case "DATE" -> buildDateSegment(segment); + case "SEQUENCE" -> sequenceAllocator.preview(rule.getId(), segment); + default -> throw new IllegalArgumentException("不支持的段类型: " + segment.getType()); + }; + } + /** * 生成固定前缀段 */ diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/SequenceAllocator.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/SequenceAllocator.java index 40081672..bed9ad55 100644 --- a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/SequenceAllocator.java +++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/codegen/SequenceAllocator.java @@ -189,4 +189,19 @@ public class SequenceAllocator { return paddingChar.repeat(paddingLen - raw.length()) + raw; } + /** + * 预览下一个序号(不实际分配,不更新数据库) + * + * @param ruleId 规则ID + * @param segment 序号段配置 + * @return 格式化后的序号字符串 + */ + public String preview(Long ruleId, SegmentConfig segment) { + String resetKey = buildResetKey(segment.getResetBy()); + CodeSequenceDO seq = codeSequenceMapper.selectByRuleIdAndResetKey(ruleId, resetKey); + Long startAt = segment.getStartAt() != null ? segment.getStartAt() : 1L; + long nextValue = (seq != null) ? seq.getCurrentValue() + 1 : startAt; + return formatSequence(nextValue, segment); + } + } diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts index eb012932..5cbea0f4 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/codegen/index.ts @@ -79,3 +79,11 @@ export async function updateCodeRule(data: BaseCodeRuleApi.CodeRule) { export async function deleteCodeRule(id: number) { return requestClient.delete(`/base/code-rule/delete?id=${id}`); } + +/** 预览下一个编码(不消耗序号) */ +export async function previewCode(ruleCode: string) { + return requestClient.get( + '/rpc-api/base/code-gen/preview', + { params: { ruleCode } }, + ); +} diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue index f9e0740f..b659f8e6 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue @@ -7,10 +7,10 @@ import { ref } from 'vue'; import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { isEmpty } from '@vben/utils'; -import { message } from 'antdv-next'; +import { Modal, message } from 'antdv-next'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; -import { deleteCodeRule, getCodeRulePage } from '#/api/base/codegen'; +import { deleteCodeRule, getCodeRulePage, previewCode } from '#/api/base/codegen'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; @@ -51,7 +51,7 @@ async function handleDelete(row: BaseCodeRuleApi.CodeRule) { } } -/** 批量删除编码规则 */ +/** 批量删除 */ async function handleDeleteBatch() { await confirm($t('ui.actionMessage.deleteBatchConfirm')); const hideLoading = message.loading({ @@ -70,6 +70,25 @@ async function handleDeleteBatch() { } } +/** 预览下一个编码 */ +const previewVisible = ref(false); +const previewLoading = ref(false); +const previewCodeValue = ref(''); +const previewTitle = ref(''); +async function handlePreview(row: BaseCodeRuleApi.CodeRule) { + previewTitle.value = row.ruleName; + previewLoading.value = true; + previewVisible.value = true; + try { + const result = await previewCode(row.ruleCode); + previewCodeValue.value = result ?? ''; + } catch { + previewCodeValue.value = '预览失败'; + } finally { + previewLoading.value = false; + } +} + const checkedIds = ref([]); function handleRowCheckboxChange({ records, @@ -145,6 +164,13 @@ const [Grid, gridApi] = useVbenVxeGrid({