feat: 完善sys_enum枚举管理与初始化能力

This commit is contained in:
2026-05-18 22:33:20 +08:00
parent 4a20a25282
commit 736f400119
10 changed files with 211 additions and 33 deletions

View File

@@ -1,6 +1,6 @@
DROP TABLE IF EXISTS sys_setting; DROP TABLE IF EXISTS sys_enum;
CREATE TABLE sys_setting ( CREATE TABLE sys_enum (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
catalog VARCHAR(200) NOT NULL, catalog VARCHAR(200) NOT NULL,
type VARCHAR(200) NOT NULL, type VARCHAR(200) NOT NULL,
@@ -17,20 +17,20 @@ CREATE TABLE sys_setting (
CONSTRAINT uk_catalog_type_name UNIQUE (catalog, type, name) CONSTRAINT uk_catalog_type_name UNIQUE (catalog, type, name)
); );
CREATE INDEX idx_sys_setting_catalog_type ON sys_setting (catalog, type); CREATE INDEX idx_sys_enum_catalog_type ON sys_enum (catalog, type);
CREATE INDEX idx_sys_setting_sort ON sys_setting (sort); CREATE INDEX idx_sys_enum_sort ON sys_enum (sort);
COMMENT ON TABLE sys_setting IS '系统枚举类'; COMMENT ON TABLE sys_enum IS '系统枚举类';
COMMENT ON COLUMN sys_setting.id IS 'ID'; COMMENT ON COLUMN sys_enum.id IS 'ID';
COMMENT ON COLUMN sys_setting.catalog IS '模块'; COMMENT ON COLUMN sys_enum.catalog IS '模块';
COMMENT ON COLUMN sys_setting.type IS '类型'; COMMENT ON COLUMN sys_enum.type IS '类型';
COMMENT ON COLUMN sys_setting.name IS '名称'; COMMENT ON COLUMN sys_enum.name IS '名称';
COMMENT ON COLUMN sys_setting.value IS ''; COMMENT ON COLUMN sys_enum.value IS '';
COMMENT ON COLUMN sys_setting.strvalue IS '字符串值'; COMMENT ON COLUMN sys_enum.strvalue IS '字符串值';
COMMENT ON COLUMN sys_setting.sort IS '排序'; COMMENT ON COLUMN sys_enum.sort IS '排序';
COMMENT ON COLUMN sys_setting.version IS '版本'; COMMENT ON COLUMN sys_enum.version IS '版本';
COMMENT ON COLUMN sys_setting.create_time IS '创建时间'; COMMENT ON COLUMN sys_enum.create_time IS '创建时间';
COMMENT ON COLUMN sys_setting.update_time IS '更新时间'; COMMENT ON COLUMN sys_enum.update_time IS '更新时间';
COMMENT ON COLUMN sys_setting.remark IS '备注'; COMMENT ON COLUMN sys_enum.remark IS '备注';
COMMENT ON COLUMN sys_setting.create_by IS '创建者'; COMMENT ON COLUMN sys_enum.create_by IS '创建者';
COMMENT ON COLUMN sys_setting.update_by IS '更新者'; COMMENT ON COLUMN sys_enum.update_by IS '更新者';

View File

@@ -4,9 +4,13 @@ import com.bruce.common.entity.SysEnum;
import com.bruce.common.service.ISysEnumService; import com.bruce.common.service.ISysEnumService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.PathVariable;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
@@ -33,4 +37,16 @@ public class SysEnumController {
public List<SysEnum> queryByCatalogAndType(@RequestParam String catalog, @RequestParam String type) { public List<SysEnum> queryByCatalogAndType(@RequestParam String catalog, @RequestParam String type) {
return sysEnumService.listByCatalogAndType(catalog, type); return sysEnumService.listByCatalogAndType(catalog, type);
} }
@Operation(summary = "新增或修改系统枚举")
@PostMapping
public boolean saveOrUpdate(@RequestBody SysEnum sysEnum) {
return sysEnumService.saveOrUpdate(sysEnum);
}
@Operation(summary = "删除系统枚举")
@DeleteMapping("/{id}")
public boolean deleteById(@PathVariable Long id) {
return sysEnumService.removeById(id);
}
} }

View File

@@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@TableName("sys_setting") @TableName("sys_enum")
@Schema(description = "系统枚举配置") @Schema(description = "系统枚举配置")
public class SysEnum extends BaseEntity { public class SysEnum extends BaseEntity {

View File

@@ -0,0 +1,20 @@
package com.bruce.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum CommonStatusEnum {
DISABLED(0, "禁用"),
ENABLED(1, "启用"),
DRAFT(2, "草稿"),
PROCESSING(3, "处理中"),
COMPLETED(4, "已完成"),
FAILED(5, "失败");
private final Integer value;
private final String label;
}

View File

@@ -0,0 +1,16 @@
package com.bruce.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum EnableStatusEnum {
DISABLED(0, "禁用"),
ENABLED(1, "启用");
private final Integer value;
private final String label;
}

View File

@@ -0,0 +1,18 @@
package com.bruce.rag.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RagIndexStatusEnum {
PENDING(1, "待索引"),
INDEXING(2, "索引中"),
INDEXED(3, "已索引"),
FAILED(4, "索引失败");
private final Integer value;
private final String label;
}

View File

@@ -0,0 +1,18 @@
package com.bruce.rag.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RagParseStatusEnum {
UPLOADED(1, "已上传"),
PARSING(2, "解析中"),
PARSED(3, "已解析"),
FAILED(4, "解析失败");
private final Integer value;
private final String label;
}

View File

@@ -1,30 +1,42 @@
package com.bruce.common.enumconfig; package com.bruce.common.enumconfig;
import com.bruce.common.enums.BaseDictEnum; import com.bruce.common.enums.CommonStatusEnum;
import com.bruce.common.enums.EnableStatusEnum; import com.bruce.common.enums.EnableStatusEnum;
import com.bruce.rag.enums.RagIndexStatusEnum; import com.bruce.rag.enums.RagIndexStatusEnum;
import com.bruce.rag.enums.RagParseStatusEnum; import com.bruce.rag.enums.RagParseStatusEnum;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class EnumDefinitionTests { class EnumDefinitionTests {
@Test @Test
void enumDefinitionsShouldExist() { void enumValuesShouldBeStable() {
assertTrue(BaseDictEnum.class.isAssignableFrom(EnableStatusEnum.class)); assertEquals(1, EnableStatusEnum.ENABLED.getValue());
assertTrue(BaseDictEnum.class.isAssignableFrom(RagParseStatusEnum.class)); assertEquals(0, EnableStatusEnum.DISABLED.getValue());
assertTrue(BaseDictEnum.class.isAssignableFrom(RagIndexStatusEnum.class)); assertEquals(0, CommonStatusEnum.DISABLED.getValue());
assertEquals(1, CommonStatusEnum.ENABLED.getValue());
assertEquals(2, CommonStatusEnum.DRAFT.getValue());
assertEquals(3, CommonStatusEnum.PROCESSING.getValue());
assertEquals(4, CommonStatusEnum.COMPLETED.getValue());
assertEquals(5, CommonStatusEnum.FAILED.getValue());
assertEquals(1, RagParseStatusEnum.UPLOADED.getValue());
assertEquals(4, RagParseStatusEnum.FAILED.getValue());
assertEquals(1, RagIndexStatusEnum.PENDING.getValue());
assertEquals(3, RagIndexStatusEnum.INDEXED.getValue());
} }
@Test @Test
void enumCodesShouldBeStable() { void enumNamesShouldBeStable() {
assertEquals("ENABLED", EnableStatusEnum.ENABLED.getCode()); assertEquals("启用", EnableStatusEnum.ENABLED.getLabel());
assertEquals("DISABLED", EnableStatusEnum.DISABLED.getCode()); assertEquals("禁用", EnableStatusEnum.DISABLED.getLabel());
assertEquals("UPLOADED", RagParseStatusEnum.UPLOADED.getCode()); assertEquals("草稿", CommonStatusEnum.DRAFT.getLabel());
assertEquals("FAILED", RagParseStatusEnum.FAILED.getCode()); assertEquals("处理中", CommonStatusEnum.PROCESSING.getLabel());
assertEquals("PENDING", RagIndexStatusEnum.PENDING.getCode()); assertEquals("已完成", CommonStatusEnum.COMPLETED.getLabel());
assertEquals("INDEXED", RagIndexStatusEnum.INDEXED.getCode()); assertEquals("失败", CommonStatusEnum.FAILED.getLabel());
assertEquals("已上传", RagParseStatusEnum.UPLOADED.getLabel());
assertEquals("解析失败", RagParseStatusEnum.FAILED.getLabel());
assertEquals("待索引", RagIndexStatusEnum.PENDING.getLabel());
assertEquals("已索引", RagIndexStatusEnum.INDEXED.getLabel());
} }
} }

View File

@@ -34,4 +34,20 @@ class SysEnumComponentStructureTests {
assertNotNull(serviceMethod); assertNotNull(serviceMethod);
assertNotNull(controllerMethod); assertNotNull(controllerMethod);
} }
@Test
void sysEnumShouldExposeSaveOrUpdateAndDeleteInterfaces() throws NoSuchMethodException {
Method saveOrUpdateMethod = SysEnumController.class.getMethod("saveOrUpdate", SysEnum.class);
Method deleteMethod = SysEnumController.class.getMethod("deleteById", Long.class);
assertNotNull(saveOrUpdateMethod);
assertNotNull(deleteMethod);
}
@Test
void sysEnumShouldProvideManualInitTestEntry() throws NoSuchMethodException {
Method initMethod = SysEnumDataInitTests.class.getMethod("initDefaultEnums");
assertNotNull(initMethod);
}
} }

View File

@@ -0,0 +1,62 @@
package com.bruce.common.enumconfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bruce.common.entity.SysEnum;
import com.bruce.common.enums.CommonStatusEnum;
import com.bruce.common.enums.EnableStatusEnum;
import com.bruce.common.service.ISysEnumService;
import com.bruce.rag.enums.RagIndexStatusEnum;
import com.bruce.rag.enums.RagParseStatusEnum;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@EnabledIfSystemProperty(named = "runEnumInit", matches = "true")
class SysEnumDataInitTests {
@Autowired
private ISysEnumService sysEnumService;
@Test
public void initDefaultEnums() {
saveOrUpdate("common", "enable_status", EnableStatusEnum.DISABLED.getLabel(), EnableStatusEnum.DISABLED.getValue(), 0, "通用启用状态");
saveOrUpdate("common", "enable_status", EnableStatusEnum.ENABLED.getLabel(), EnableStatusEnum.ENABLED.getValue(), 1, "通用启用状态");
saveOrUpdate("common", "common_status", CommonStatusEnum.DISABLED.getLabel(), CommonStatusEnum.DISABLED.getValue(), 0, "通用状态");
saveOrUpdate("common", "common_status", CommonStatusEnum.ENABLED.getLabel(), CommonStatusEnum.ENABLED.getValue(), 1, "通用状态");
saveOrUpdate("common", "common_status", CommonStatusEnum.DRAFT.getLabel(), CommonStatusEnum.DRAFT.getValue(), 2, "通用状态");
saveOrUpdate("common", "common_status", CommonStatusEnum.PROCESSING.getLabel(), CommonStatusEnum.PROCESSING.getValue(), 3, "通用状态");
saveOrUpdate("common", "common_status", CommonStatusEnum.COMPLETED.getLabel(), CommonStatusEnum.COMPLETED.getValue(), 4, "通用状态");
saveOrUpdate("common", "common_status", CommonStatusEnum.FAILED.getLabel(), CommonStatusEnum.FAILED.getValue(), 5, "通用状态");
saveOrUpdate("rag", "parse_status", RagParseStatusEnum.UPLOADED.getLabel(), RagParseStatusEnum.UPLOADED.getValue(), 1, "RAG文档解析状态");
saveOrUpdate("rag", "parse_status", RagParseStatusEnum.PARSING.getLabel(), RagParseStatusEnum.PARSING.getValue(), 2, "RAG文档解析状态");
saveOrUpdate("rag", "parse_status", RagParseStatusEnum.PARSED.getLabel(), RagParseStatusEnum.PARSED.getValue(), 3, "RAG文档解析状态");
saveOrUpdate("rag", "parse_status", RagParseStatusEnum.FAILED.getLabel(), RagParseStatusEnum.FAILED.getValue(), 4, "RAG文档解析状态");
saveOrUpdate("rag", "index_status", RagIndexStatusEnum.PENDING.getLabel(), RagIndexStatusEnum.PENDING.getValue(), 1, "RAG文档索引状态");
saveOrUpdate("rag", "index_status", RagIndexStatusEnum.INDEXING.getLabel(), RagIndexStatusEnum.INDEXING.getValue(), 2, "RAG文档索引状态");
saveOrUpdate("rag", "index_status", RagIndexStatusEnum.INDEXED.getLabel(), RagIndexStatusEnum.INDEXED.getValue(), 3, "RAG文档索引状态");
saveOrUpdate("rag", "index_status", RagIndexStatusEnum.FAILED.getLabel(), RagIndexStatusEnum.FAILED.getValue(), 4, "RAG文档索引状态");
}
private void saveOrUpdate(String catalog, String type, String name, Integer value, Integer sort, String remark) {
SysEnum sysEnum = sysEnumService.getOne(new LambdaQueryWrapper<SysEnum>()
.eq(SysEnum::getCatalog, catalog)
.eq(SysEnum::getType, type)
.eq(SysEnum::getName, name));
if (sysEnum == null) {
sysEnum = new SysEnum();
}
sysEnum.setCatalog(catalog);
sysEnum.setType(type);
sysEnum.setName(name);
sysEnum.setValue(value);
sysEnum.setStrvalue(null);
sysEnum.setSort(sort);
sysEnum.setRemark(remark);
sysEnumService.saveOrUpdate(sysEnum);
}
}