diff --git a/src/main/java/com/cczsa/xinghe/codegen/controller/FunItemController.java b/src/main/java/com/cczsa/xinghe/codegen/controller/FunItemController.java index 9e45ecf..a1c9be5 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/controller/FunItemController.java +++ b/src/main/java/com/cczsa/xinghe/codegen/controller/FunItemController.java @@ -1,6 +1,7 @@ package com.cczsa.xinghe.codegen.controller; +import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemQueryReq; import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemSaveUpdateReq; import com.cczsa.xinghe.codegen.entity.res.funItem.FunItemQueryRes; @@ -16,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * 功能管理 控制层。 * @@ -33,24 +36,23 @@ public class FunItemController { @Operation(summary = "获取功能列表", description = "获取功能列表") @PostMapping("/query") - public XResult query(@RequestBody @Valid FunItemQueryReq req ) { - return funitemService.query(req); + public XResult> query(@RequestBody @Valid FunItemQueryReq req) { + return funitemService.query(req); } @Operation(summary = "创建/修改功能", description = "创建/修改功能") @PostMapping("/save/update") - public XResult saveUpdate(@RequestBody @Valid FunItemSaveUpdateReq req ) { - return funitemService.saveUpdate(req); + public XResult saveUpdate(@RequestBody @Valid FunItemSaveUpdateReq req) { + return funitemService.saveUpdate(req); } @Operation(summary = "删除功能", description = "删除功能") @DeleteMapping("/delete") - public XResult delete() { - return funitemService.delete(); + public XResult delete(@RequestBody @Valid FunItemDeleteReq req) { + return funitemService.delete(req); } - } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/controller/FunModuleController.java b/src/main/java/com/cczsa/xinghe/codegen/controller/FunModuleController.java index d892889..7d50ed4 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/controller/FunModuleController.java +++ b/src/main/java/com/cczsa/xinghe/codegen/controller/FunModuleController.java @@ -4,6 +4,7 @@ package com.cczsa.xinghe.codegen.controller; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleQueryReq; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleSaveUpdateReq; +import com.cczsa.xinghe.codegen.entity.req.funModule.GetIdListReq; import com.cczsa.xinghe.codegen.entity.res.funModule.FunModuleQueryRes; import com.cczsa.xinghe.codegen.service.FunModuleService; import com.cczsa.xinghe.codegen.util.XResult; @@ -11,6 +12,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -45,10 +47,16 @@ public class FunModuleController { } @Operation(summary = "删除模块", description = "删除模块") - @PostMapping("/delete") + @DeleteMapping("/delete") public XResult delete(@RequestBody @Valid FunModuleDeleteReq req) { return funmoduleService.delete(req); } + @Operation(summary = "获取ID列表", description = "获取ID列表") + @PostMapping("/getIdList") + public XResult> getIdList(@RequestBody @Valid GetIdListReq req) { + return funmoduleService.getIdList(req); + } + } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/controller/FunOperationController.java b/src/main/java/com/cczsa/xinghe/codegen/controller/FunOperationController.java index 6b057e5..0690dbe 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/controller/FunOperationController.java +++ b/src/main/java/com/cczsa/xinghe/codegen/controller/FunOperationController.java @@ -1,5 +1,6 @@ package com.cczsa.xinghe.codegen.controller; +import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationQueryReq; import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationSaveUpdateReq; import com.cczsa.xinghe.codegen.entity.res.funOperation.FunOperationQueryRes; @@ -15,6 +16,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + /** * 操作管理 控制层。 * @@ -31,22 +34,21 @@ public class FunOperationController { @Operation(summary = "获取操作列表", description = "获取操作列表") @PostMapping("/query") - public XResult query(@RequestBody @Valid FunOperationQueryReq req ) { - return funoperationService.query(req); + public XResult> query(@RequestBody @Valid FunOperationQueryReq req) { + return funoperationService.query(req); } @Operation(summary = "创建/修改操作", description = "创建/修改操作") @PostMapping("/save/update") - public XResult saveUpdate(@RequestBody @Valid FunOperationSaveUpdateReq req ) { - return funoperationService.saveUpdate(req); + public XResult saveUpdate(@RequestBody @Valid FunOperationSaveUpdateReq req) { + return funoperationService.saveUpdate(req); } @Operation(summary = "删除操作", description = "删除操作") @DeleteMapping("/delete") - public XResult delete() { - return funoperationService.delete(); + public XResult delete(@RequestBody @Valid FunOperationDeleteReq req) { + return funoperationService.delete(req); } - } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/FunOperationEntity.java b/src/main/java/com/cczsa/xinghe/codegen/entity/FunOperationEntity.java index ff075f1..45801be 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/FunOperationEntity.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/FunOperationEntity.java @@ -2,6 +2,7 @@ package com.cczsa.xinghe.codegen.entity; import com.cczsa.xinghe.codegen.entity.enums.FunTypeEnum; import com.cczsa.xinghe.codegen.entity.enums.RequestTypeEnum; +import com.cczsa.xinghe.codegen.entity.enums.UsableConfigEnum; import com.cczsa.xinghe.codegen.handler.PostgreSQLJsonTypeHandler; import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; @@ -79,7 +80,7 @@ public class FunOperationEntity extends BaseEntity implements Serializable { * 可配置数据类型json[] */ @Column(typeHandler = PostgreSQLJsonTypeHandler.class) - private List usableConfig; + private List usableConfig; /** * 可配置字段 diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/enums/IdTypeEnum.java b/src/main/java/com/cczsa/xinghe/codegen/entity/enums/IdTypeEnum.java new file mode 100644 index 0000000..0361c03 --- /dev/null +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/enums/IdTypeEnum.java @@ -0,0 +1,36 @@ +package com.cczsa.xinghe.codegen.entity.enums; + +import com.fasterxml.jackson.annotation.JsonValue; +import com.mybatisflex.annotation.EnumValue; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +/** + * ID类型枚举 + * + * @author My + */ +@Schema(description = "ID类型", + example = "0", + allowableValues = {"0: 模块ID", "1: 功能ID", "2: 操作ID"}) +@Getter +public enum IdTypeEnum { + // 0: 模块ID 1: 功能ID 2: 操作ID + MODULE_ID(0, "模块ID"), + ITEM_ID(1, "功能ID"), + OPERATION_ID(2, "操作ID"); + + private final int code; + private final String desc; + + IdTypeEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + @JsonValue + @EnumValue + public int getCode() { + return code; + } +} \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/enums/UsableConfigEnum.java b/src/main/java/com/cczsa/xinghe/codegen/entity/enums/UsableConfigEnum.java new file mode 100644 index 0000000..7408705 --- /dev/null +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/enums/UsableConfigEnum.java @@ -0,0 +1,43 @@ +package com.cczsa.xinghe.codegen.entity.enums; + +import com.fasterxml.jackson.annotation.JsonValue; +import com.mybatisflex.annotation.EnumValue; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +/** + * 可配置数据类型 + * + * @author My + */ +@Schema(description = "可配置数据类型", + example = "0", + allowableValues = {"0: 无需处理", "1: 所有", "2: 本人", "3: 本部门", + "4: 本部门及子部门", "5: 指定部门", "6: 指定人员" + }) +@Getter +public enum UsableConfigEnum { + + NO_PROCESSING(0, "无需处理"), + ALL(1, "所有"), + SELF(2, "本人"), + DEPARTMENT(3, "本部门"), + DEPARTMENT_AND_SUB(4, "本部门及子部门"), + SPECIFIED_DEPARTMENT(5, "指定部门"), + SPECIFIED_USER(6, "指定人员"); + + + private final int code; + private final String desc; + + UsableConfigEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + @JsonValue + @EnumValue + public int getCode() { + return code; + } +} diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemDeleteReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemDeleteReq.java new file mode 100644 index 0000000..6a7972d --- /dev/null +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemDeleteReq.java @@ -0,0 +1,35 @@ +package com.cczsa.xinghe.codegen.entity.req.funItem; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 删除功能 请求参数 + * + * @author my + * @version 0.0.1 + */ +@Getter +@Setter +@Schema(description = "删除功能-参数") +public class FunItemDeleteReq implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotNull(message = "功能id列表不能为空") + @Schema(description = "功能id列表") + private List idList; + + @NotBlank(message = "操作密码不能为空") + @Schema(description = "操作密码") + private String operationPassword; + +} diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemQueryReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemQueryReq.java index fc415ea..1a78495 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemQueryReq.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemQueryReq.java @@ -1,6 +1,7 @@ package com.cczsa.xinghe.codegen.entity.req.funItem; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import java.io.Serial; @@ -19,4 +20,14 @@ public class FunItemQueryReq implements Serializable { @Serial private static final long serialVersionUID = 1L; + @NotNull(message = "模块ID不能为空") + @Schema(description = "模块ID") + private Long moduleId; + + @Schema(description = "功能名称") + private String itemName; + + @Schema(description = "功能编码") + private String itemCode; + } diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemSaveUpdateReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemSaveUpdateReq.java index 39b2ee3..6e2d1c2 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemSaveUpdateReq.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funItem/FunItemSaveUpdateReq.java @@ -1,13 +1,20 @@ package com.cczsa.xinghe.codegen.entity.req.funItem; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import lombok.Getter; import lombok.Setter; + import java.io.Serial; import java.io.Serializable; /** * 创建/修改功能 请求参数 + * * @author xia * @version 0.0.1 */ @@ -19,4 +26,39 @@ public class FunItemSaveUpdateReq implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "主键id(修改必填)") + private Long id; + + @NotNull(message = "模块ID不能为空") + @Schema(description = "模块ID") + @Min(value = 10, message = "模块ID必须大于等于10小于等于99") + @Max(value = 99, message = "模块ID必须大于等于10小于等于99") + private Long moduleId; + + + @NotBlank(message = "功能名称不能为空") + @Schema(description = "功能名称") + private String itemName; + + @NotBlank(message = "功能编码不能为空") + @Pattern(regexp = "^[a-z]+$", message = "功能编码只能包含英文小写字母") + @Schema(description = "功能编码") + private String itemCode; + + @NotNull(message = "是否租户不能为空") + @Schema(description = "是否租户") + private Boolean isTenant; + + @Schema(description = "描述") + private String describe; + + @Schema(description = "排序") + private Integer sortOrder; + + @NotNull(message = "功能ID不能为空") + @Schema(description = "功能ID") + @Min(value = 10, message = "功能ID必须大于等于10小于等于99") + @Max(value = 99, message = "功能ID必须大于等于10小于等于99") + private Long itemId; + } diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleDeleteReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleDeleteReq.java index 7d7332f..f982118 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleDeleteReq.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleDeleteReq.java @@ -6,6 +6,8 @@ import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; +import java.io.Serial; +import java.io.Serializable; import java.util.List; /** @@ -17,12 +19,14 @@ import java.util.List; @Getter @Setter @Schema(description = "删除模块-参数") -public class FunModuleDeleteReq { +public class FunModuleDeleteReq implements Serializable { + @Serial + private static final long serialVersionUID = 1L; @NotNull(message = "模块id列表不能为空") @Schema(description = "模块id列表") - private List moduleIdList; + private List idList; @NotBlank(message = "操作密码不能为空") @Schema(description = "操作密码") diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleSaveUpdateReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleSaveUpdateReq.java index b9d8594..1c153b5 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleSaveUpdateReq.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/FunModuleSaveUpdateReq.java @@ -26,8 +26,8 @@ public class FunModuleSaveUpdateReq implements Serializable { @NotNull(message = "id不能为空") @Schema(description = "id") - @Min(value = 10, message = "id必须大于等于10") - @Max(value = 99, message = "id必须小于等于99") + @Min(value = 10, message = "id必须大于等于10小于等于99") + @Max(value = 99, message = "id必须大于等于10小于等于99") private Long id; @NotBlank(message = "模块名称不能为空") diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/GetIdListReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/GetIdListReq.java new file mode 100644 index 0000000..55b0cff --- /dev/null +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funModule/GetIdListReq.java @@ -0,0 +1,35 @@ +package com.cczsa.xinghe.codegen.entity.req.funModule; + +import com.cczsa.xinghe.codegen.entity.enums.IdTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 获取ID列表 请求参数 + * @author xia + * @version 0.0.1 + */ +@Getter +@Setter +@Schema(description = "获取ID列表-参数") +public class GetIdListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotNull(message = "Id类型不能为空") + @Schema(description = "Id类型(0: 模块ID 1: 功能ID 2: 操作ID)") + private IdTypeEnum idType; + + @Schema(description = "模块ID(表主键ID)") + private Long moduleId; + + @Schema(description = "功能ID(表主键ID)") + private Long itemId; + +} diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationDeleteReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationDeleteReq.java new file mode 100644 index 0000000..88f364b --- /dev/null +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationDeleteReq.java @@ -0,0 +1,30 @@ +package com.cczsa.xinghe.codegen.entity.req.funOperation; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 删除操作 请求参数 + * + * @author my + * @version 0.0.1 + */ +@Getter +@Setter +@Schema(description = "删除操作-参数") +public class FunOperationDeleteReq implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @NotNull(message = "操作id列表不能为空") + @Schema(description = "操作id列表") + private List idList; + +} diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationQueryReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationQueryReq.java index 67a4856..590464e 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationQueryReq.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationQueryReq.java @@ -1,6 +1,7 @@ package com.cczsa.xinghe.codegen.entity.req.funOperation; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import java.io.Serial; @@ -19,4 +20,13 @@ public class FunOperationQueryReq implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "功能ID(表主键ID)") + private Long itemId; + + @Schema(description = "操作名称") + private String funName; + + @Schema(description = "操作编码") + private String operationCode; + } diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationSaveUpdateReq.java b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationSaveUpdateReq.java index 15137ad..f870370 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationSaveUpdateReq.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/req/funOperation/FunOperationSaveUpdateReq.java @@ -1,13 +1,26 @@ package com.cczsa.xinghe.codegen.entity.req.funOperation; +import com.cczsa.xinghe.codegen.entity.enums.FunTypeEnum; +import com.cczsa.xinghe.codegen.entity.enums.RequestTypeEnum; +import com.cczsa.xinghe.codegen.entity.enums.UsableConfigEnum; +import com.cczsa.xinghe.codegen.handler.PostgreSQLJsonTypeHandler; +import com.mybatisflex.annotation.Column; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import lombok.Getter; import lombok.Setter; + import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 创建/修改操作 请求参数 + * * @author xia * @version 0.0.1 */ @@ -19,4 +32,59 @@ public class FunOperationSaveUpdateReq implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "主键id(修改必填)") + private Long id; + + @NotNull(message = "模块ID不能为空") + @Schema(description = "模块ID") + @Min(value = 10, message = "模块ID必须大于等于10小于等于99") + @Max(value = 99, message = "模块ID必须大于等于10小于等于99") + private Long moduleId; + + @NotNull(message = "功能ID不能为空") + @Schema(description = "功能ID(表主键ID)") + private Long itemId; + + @NotNull(message = "是否直接放行不能为空") + @Schema(description = "是否直接放行") + private Boolean isGreenLight; + + @NotBlank(message = "操作名称不能为空") + @Schema(description = "操作名称") + private String funName; + + @NotBlank(message = "操作编码不能为空") + @Pattern(regexp = "^[a-z]+(?:-[a-z]+)*$", message = "操作编码只能包含英文小写字母和连字符(-),且连字符不能在开头或结尾") + @Schema(description = "操作编码") + private String operationCode; + + @NotNull(message = "操作类型不能为空") + @Schema(description = "操作类型") + private FunTypeEnum funType; + + @NotNull(message = "请求类型不能为空") + @Schema(description = "请求类型") + private RequestTypeEnum requestType; + + @NotNull(message = "可配置数据类型不能为空") + @Schema(description = "可配置数据类型") + @Column(typeHandler = PostgreSQLJsonTypeHandler.class) + private List usableConfig; + + @Schema(description = "可配置字段") + @Column(typeHandler = PostgreSQLJsonTypeHandler.class) + private List fieldCofnig; + + @Schema(description = "排序") + private Integer sortOrder; + + @Schema(description = "说明") + private String describe; + + @NotNull(message = "操作ID不能为空") + @Schema(description = "操作ID") + @Min(value = 10, message = "操作ID必须大于等于10小于等于99") + @Max(value = 99, message = "操作ID必须大于等于10小于等于99") + private Integer operationId; + } diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/res/funItem/FunItemQueryRes.java b/src/main/java/com/cczsa/xinghe/codegen/entity/res/funItem/FunItemQueryRes.java index 5da4356..77a66b8 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/res/funItem/FunItemQueryRes.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/res/funItem/FunItemQueryRes.java @@ -3,11 +3,13 @@ package com.cczsa.xinghe.codegen.entity.res.funItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; + import java.io.Serial; import java.io.Serializable; /** * 获取功能列表 响应参数 + * * @author xia * @version 0.0.1 */ @@ -19,4 +21,28 @@ public class FunItemQueryRes implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "主键id") + private Long id; + + @Schema(description = "模块ID") + private Long moduleId; + + @Schema(description = "功能名称") + private String itemName; + + @Schema(description = "功能编码") + private String itemCode; + + @Schema(description = "是否租户") + private Boolean isTenant; + + @Schema(description = "描述") + private String describe; + + @Schema(description = "排序") + private Integer sortOrder; + + @Schema(description = "功能ID") + private Long itemId; + } diff --git a/src/main/java/com/cczsa/xinghe/codegen/entity/res/funOperation/FunOperationQueryRes.java b/src/main/java/com/cczsa/xinghe/codegen/entity/res/funOperation/FunOperationQueryRes.java index 4a36975..b29305c 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/entity/res/funOperation/FunOperationQueryRes.java +++ b/src/main/java/com/cczsa/xinghe/codegen/entity/res/funOperation/FunOperationQueryRes.java @@ -1,13 +1,26 @@ package com.cczsa.xinghe.codegen.entity.res.funOperation; +import com.cczsa.xinghe.codegen.entity.enums.FunTypeEnum; +import com.cczsa.xinghe.codegen.entity.enums.RequestTypeEnum; +import com.cczsa.xinghe.codegen.entity.enums.UsableConfigEnum; +import com.cczsa.xinghe.codegen.handler.PostgreSQLJsonTypeHandler; +import com.mybatisflex.annotation.Column; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; import lombok.Getter; import lombok.Setter; + import java.io.Serial; import java.io.Serializable; +import java.util.List; /** * 获取操作列表 响应参数 + * * @author xia * @version 0.0.1 */ @@ -19,4 +32,45 @@ public class FunOperationQueryRes implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "主键id(修改必填)") + private Long id; + + @Schema(description = "模块ID(表主键ID)") + private Long moduleId; + + @Schema(description = "功能ID(表主键ID)") + private Long itemId; + + @Schema(description = "是否直接放行") + private Boolean isGreenLight; + + @Schema(description = "操作名称") + private String funName; + + @Schema(description = "操作编码") + private String operationCode; + + @Schema(description = "操作类型") + private FunTypeEnum funType; + + @Schema(description = "请求类型") + private RequestTypeEnum requestType; + + @Schema(description = "可配置数据类型") + @Column(typeHandler = PostgreSQLJsonTypeHandler.class) + private List usableConfig; + + @Schema(description = "可配置字段") + @Column(typeHandler = PostgreSQLJsonTypeHandler.class) + private List fieldCofnig; + + @Schema(description = "排序") + private Integer sortOrder; + + @Schema(description = "说明") + private String describe; + + @Schema(description = "操作ID") + private Integer operationId; + } diff --git a/src/main/java/com/cczsa/xinghe/codegen/service/FunItemService.java b/src/main/java/com/cczsa/xinghe/codegen/service/FunItemService.java index 1d1e6c3..1d366a6 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/service/FunItemService.java +++ b/src/main/java/com/cczsa/xinghe/codegen/service/FunItemService.java @@ -1,10 +1,13 @@ package com.cczsa.xinghe.codegen.service; +import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemQueryReq; import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemSaveUpdateReq; import com.cczsa.xinghe.codegen.entity.res.funItem.FunItemQueryRes; import com.cczsa.xinghe.codegen.util.XResult; +import java.util.List; + /** * 功能管理 服务层接口。 * @@ -16,7 +19,7 @@ public interface FunItemService { /** * 获取功能列表 */ - XResult query(FunItemQueryReq req); + XResult> query(FunItemQueryReq req); /** * 创建/修改功能 @@ -26,7 +29,7 @@ public interface FunItemService { /** * 删除功能 */ - XResult delete(); + XResult delete(FunItemDeleteReq req); } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/service/FunModuleService.java b/src/main/java/com/cczsa/xinghe/codegen/service/FunModuleService.java index 4963e1b..53e4bf4 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/service/FunModuleService.java +++ b/src/main/java/com/cczsa/xinghe/codegen/service/FunModuleService.java @@ -3,6 +3,7 @@ package com.cczsa.xinghe.codegen.service; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleQueryReq; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleSaveUpdateReq; +import com.cczsa.xinghe.codegen.entity.req.funModule.GetIdListReq; import com.cczsa.xinghe.codegen.entity.res.funModule.FunModuleQueryRes; import com.cczsa.xinghe.codegen.util.XResult; @@ -32,4 +33,9 @@ public interface FunModuleService { XResult delete(FunModuleDeleteReq req); + /** + * 获取ID列表 + */ + XResult> getIdList(GetIdListReq req); + } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/service/FunOperationService.java b/src/main/java/com/cczsa/xinghe/codegen/service/FunOperationService.java index cc8655c..2649159 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/service/FunOperationService.java +++ b/src/main/java/com/cczsa/xinghe/codegen/service/FunOperationService.java @@ -1,10 +1,13 @@ package com.cczsa.xinghe.codegen.service; +import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationQueryReq; import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationSaveUpdateReq; import com.cczsa.xinghe.codegen.entity.res.funOperation.FunOperationQueryRes; import com.cczsa.xinghe.codegen.util.XResult; +import java.util.List; + /** * 操作管理 服务层接口。 * @@ -16,7 +19,7 @@ public interface FunOperationService { /** * 获取操作列表 */ - XResult query(FunOperationQueryReq req); + XResult> query(FunOperationQueryReq req); /** * 创建/修改操作 @@ -26,7 +29,7 @@ public interface FunOperationService { /** * 删除操作 */ - XResult delete(); + XResult delete(FunOperationDeleteReq req); } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunItemServiceImpl.java b/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunItemServiceImpl.java index 4d6e7ca..aebc932 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunItemServiceImpl.java +++ b/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunItemServiceImpl.java @@ -1,49 +1,114 @@ package com.cczsa.xinghe.codegen.service.impl; +import com.cczsa.xinghe.codegen.constant.CodegenConstant; +import com.cczsa.xinghe.codegen.entity.FunItemEntity; +import com.cczsa.xinghe.codegen.entity.FunModuleEntity; +import com.cczsa.xinghe.codegen.entity.FunOperationEntity; +import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemQueryReq; import com.cczsa.xinghe.codegen.entity.req.funItem.FunItemSaveUpdateReq; import com.cczsa.xinghe.codegen.entity.res.funItem.FunItemQueryRes; +import com.cczsa.xinghe.codegen.mapper.FunItemMapper; +import com.cczsa.xinghe.codegen.mapper.FunModuleMapper; +import com.cczsa.xinghe.codegen.mapper.FunOperationMapper; +import com.cczsa.xinghe.codegen.mapper.def.FunItemDef; import com.cczsa.xinghe.codegen.service.FunItemService; import com.cczsa.xinghe.codegen.util.XResult; +import com.github.xiaoymin.knife4j.core.util.StrUtil; +import com.mybatisflex.core.query.QueryWrapper; import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** -* 功能管理 服务层实现。 -* -* @author xia -* @version 0.0.1 -*/ + * 功能管理 服务层实现。 + * + * @author xia + * @version 0.0.1 + */ @Service @RequiredArgsConstructor public class FunItemServiceImpl implements FunItemService { + private final FunItemMapper funItemMapper; + private final FunOperationMapper funOperationMapper; + private final FunModuleMapper funModuleMapper; /** * 获取功能列表 */ - @Override - public XResult query(FunItemQueryReq req) { - // TODO 实现 获取功能列表 业务逻辑 - return null; - } + @Override + public XResult> query(FunItemQueryReq req) { + FunItemDef funItemDef = FunItemDef.FUN_ITEM_ENTITY; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.select(funItemDef.ALL_COLUMNS) + .from(funItemDef) + .eq(FunItemEntity::getModuleId, req.getModuleId()) + .like(FunItemEntity::getItemName, req.getItemName(), StrUtil.isNotBlank(req.getItemName())) + .like(FunItemEntity::getItemCode, req.getItemCode(), StrUtil.isNotBlank(req.getItemCode())) + .orderBy(FunItemEntity::getSortOrder, true); + List funItemQueryRes = funItemMapper.selectListByQueryAs(queryWrapper, FunItemQueryRes.class); + return XResult.ok(funItemQueryRes); + } /** * 创建/修改功能 */ - @Override - public XResult saveUpdate(FunItemSaveUpdateReq req) { - // TODO 实现 创建/修改功能 业务逻辑 - return null; - } + @Transactional + @Override + public XResult saveUpdate(FunItemSaveUpdateReq req) { + Long id = req.getId(); + if (id != null) { + // 删除原数据 + QueryWrapper deleteItem = new QueryWrapper(); + deleteItem.eq(FunItemEntity::getId, id); + funItemMapper.deleteByQuery(deleteItem); + } + id = Long.valueOf(req.getModuleId().toString() + req.getItemId().toString()); + // 模块是否存在 + QueryWrapper queryModule = new QueryWrapper(); + queryModule.eq(FunModuleEntity::getId, req.getModuleId()); + if (funModuleMapper.selectCountByQuery(queryModule) <= 0) { + return XResult.failed("模块不存在"); + } + // 同一个模块是否存在相同功能ID + QueryWrapper queryItem = new QueryWrapper(); + queryItem.eq(FunItemEntity::getModuleId, req.getModuleId()); + queryItem.eq(FunItemEntity::getItemId, req.getItemId()); + if (req.getId() != null) { + queryItem.ne(FunItemEntity::getId, req.getId()); + } + if (funItemMapper.selectCountByQuery(queryItem) > 0) { + return XResult.failed("功能ID已存在"); + } + FunItemEntity funItemEntity = new FunItemEntity(); + BeanUtils.copyProperties(req, funItemEntity); + funItemEntity.setId(id); + funItemMapper.insertSelective(funItemEntity); + return XResult.ok(); + } /** * 删除功能 */ - @Override - public XResult delete() { - // TODO 实现 删除功能 业务逻辑 - return null; - } + @Override + public XResult delete(FunItemDeleteReq req) { + // 校验密码 + if (!req.getOperationPassword().equals(CodegenConstant.OPERATION_PASSWORD)) { + return XResult.failed("操作密码错误"); + } + // 删除功能 + QueryWrapper deleteItem = new QueryWrapper(); + deleteItem.in(FunItemEntity::getId, req.getIdList()); + funItemMapper.deleteByQuery(deleteItem); + // 删除操作 + QueryWrapper deleteOperation = new QueryWrapper(); + deleteOperation.in(FunOperationEntity::getItemId, req.getIdList()); + funOperationMapper.deleteByQuery(deleteOperation); + return XResult.ok(); + } } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunModuleServiceImpl.java b/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunModuleServiceImpl.java index d7406c3..6f942d5 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunModuleServiceImpl.java +++ b/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunModuleServiceImpl.java @@ -4,14 +4,18 @@ import com.cczsa.xinghe.codegen.constant.CodegenConstant; import com.cczsa.xinghe.codegen.entity.FunItemEntity; import com.cczsa.xinghe.codegen.entity.FunModuleEntity; import com.cczsa.xinghe.codegen.entity.FunOperationEntity; +import com.cczsa.xinghe.codegen.entity.enums.IdTypeEnum; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleQueryReq; import com.cczsa.xinghe.codegen.entity.req.funModule.FunModuleSaveUpdateReq; +import com.cczsa.xinghe.codegen.entity.req.funModule.GetIdListReq; import com.cczsa.xinghe.codegen.entity.res.funModule.FunModuleQueryRes; import com.cczsa.xinghe.codegen.mapper.FunItemMapper; import com.cczsa.xinghe.codegen.mapper.FunModuleMapper; import com.cczsa.xinghe.codegen.mapper.FunOperationMapper; +import com.cczsa.xinghe.codegen.mapper.def.FunItemDef; import com.cczsa.xinghe.codegen.mapper.def.FunModuleDef; +import com.cczsa.xinghe.codegen.mapper.def.FunOperationDef; import com.cczsa.xinghe.codegen.service.FunModuleService; import com.cczsa.xinghe.codegen.util.XResult; import com.github.xiaoymin.knife4j.core.util.StrUtil; @@ -22,6 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.stream.LongStream; /** * 模块管理 服务层实现。 @@ -43,8 +48,10 @@ public class FunModuleServiceImpl implements FunModuleService { */ @Override public XResult> query(FunModuleQueryReq req) { + FunModuleDef funModuleDef = FunModuleDef.FUN_MODULE_ENTITY; QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.select(FunModuleDef.FUN_MODULE_ENTITY.ALL_COLUMNS) + queryWrapper.select(funModuleDef.ALL_COLUMNS) + .from(funModuleDef) .like(FunModuleEntity::getModuleName, req.getModuleName(), StrUtil.isNotBlank(req.getModuleName())) .like(FunModuleEntity::getModuleCode, req.getModuleCode(), StrUtil.isNotBlank(req.getModuleCode())) .orderBy(FunModuleEntity::getSortOrder, true); @@ -55,6 +62,7 @@ public class FunModuleServiceImpl implements FunModuleService { /** * 创建/修改模块 */ + @Transactional @Override public XResult saveUpdate(FunModuleSaveUpdateReq req) { // 模块编码不能重复 @@ -68,7 +76,7 @@ public class FunModuleServiceImpl implements FunModuleService { BeanUtils.copyProperties(req, funModuleEntity); int update = funModuleMapper.update(funModuleEntity); if (update <= 0) { - funModuleMapper.insert(funModuleEntity); + funModuleMapper.insertSelective(funModuleEntity); } return XResult.ok(); } @@ -79,7 +87,7 @@ public class FunModuleServiceImpl implements FunModuleService { @Transactional @Override public XResult delete(FunModuleDeleteReq req) { - List ids = req.getModuleIdList(); + List ids = req.getIdList(); if (!req.getOperationPassword().equals(CodegenConstant.OPERATION_PASSWORD)) { return XResult.failed("操作密码错误"); } @@ -98,4 +106,57 @@ public class FunModuleServiceImpl implements FunModuleService { return XResult.ok(); } + /** + * 获取ID列表 + */ + @Override + public XResult> getIdList(GetIdListReq req) { + if (req.getIdType() == IdTypeEnum.ITEM_ID && req.getModuleId() == null) { + return XResult.failed("模块ID必填"); + } + if (req.getIdType() == IdTypeEnum.OPERATION_ID && req.getItemId() == null) { + return XResult.failed("功能ID必填"); + } + // 获取10-99的ID + List idList = LongStream.rangeClosed(10, 99) + .boxed() + .toList(); + List filteredIdList = null; + switch (req.getIdType()) { + case MODULE_ID: + FunModuleDef funModuleDef = FunModuleDef.FUN_MODULE_ENTITY; + QueryWrapper queryModuleId = new QueryWrapper(); + queryModuleId.select(funModuleDef.ID) + .from(funModuleDef); + List moduleExistIdList = funModuleMapper.selectListByQueryAs(queryModuleId, Long.class); + filteredIdList = idList.stream() + .filter(id -> !moduleExistIdList.contains(id)) + .toList(); + break; + case ITEM_ID: + FunItemDef funItemDef = FunItemDef.FUN_ITEM_ENTITY; + QueryWrapper queryFunctionId = new QueryWrapper(); + queryFunctionId.select(funItemDef.ITEM_ID) + .from(funItemDef) + .eq(FunItemEntity::getModuleId, req.getModuleId()); + List functionExistIdList = funItemMapper.selectListByQueryAs(queryFunctionId, Long.class); + filteredIdList = idList.stream() + .filter(id -> !functionExistIdList.contains(id)) + .toList(); + break; + case OPERATION_ID: + FunOperationDef funOperationDef = FunOperationDef.FUN_OPERATION_ENTITY; + QueryWrapper queryOperationId = new QueryWrapper(); + queryOperationId.select(funOperationDef.OPERATION_ID) + .from(funOperationDef) + .eq(FunOperationEntity::getItemId, req.getItemId()); + List operationExistIdList = funOperationMapper.selectListByQueryAs(queryOperationId, Long.class); + filteredIdList = idList.stream() + .filter(id -> !operationExistIdList.contains(id)) + .toList(); + break; + } + return XResult.ok(filteredIdList); + } + } \ No newline at end of file diff --git a/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunOperationServiceImpl.java b/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunOperationServiceImpl.java index fd5a816..703717f 100644 --- a/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunOperationServiceImpl.java +++ b/src/main/java/com/cczsa/xinghe/codegen/service/impl/FunOperationServiceImpl.java @@ -1,49 +1,111 @@ package com.cczsa.xinghe.codegen.service.impl; +import com.cczsa.xinghe.codegen.entity.FunItemEntity; +import com.cczsa.xinghe.codegen.entity.FunModuleEntity; +import com.cczsa.xinghe.codegen.entity.FunOperationEntity; +import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationDeleteReq; import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationQueryReq; import com.cczsa.xinghe.codegen.entity.req.funOperation.FunOperationSaveUpdateReq; import com.cczsa.xinghe.codegen.entity.res.funOperation.FunOperationQueryRes; +import com.cczsa.xinghe.codegen.mapper.FunItemMapper; +import com.cczsa.xinghe.codegen.mapper.FunModuleMapper; +import com.cczsa.xinghe.codegen.mapper.FunOperationMapper; +import com.cczsa.xinghe.codegen.mapper.def.FunOperationDef; import com.cczsa.xinghe.codegen.service.FunOperationService; import com.cczsa.xinghe.codegen.util.XResult; +import com.github.xiaoymin.knife4j.core.util.StrUtil; +import com.mybatisflex.core.query.QueryWrapper; import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; /** -* 操作管理 服务层实现。 -* -* @author xia -* @version 0.0.1 -*/ + * 操作管理 服务层实现。 + * + * @author xia + * @version 0.0.1 + */ @Service @RequiredArgsConstructor public class FunOperationServiceImpl implements FunOperationService { + private final FunItemMapper funItemMapper; + private final FunOperationMapper funOperationMapper; + private final FunModuleMapper funModuleMapper; /** * 获取操作列表 */ - @Override - public XResult query(FunOperationQueryReq req) { - // TODO 实现 获取操作列表 业务逻辑 - return null; - } + @Override + public XResult> query(FunOperationQueryReq req) { + FunOperationDef funOperationDef = FunOperationDef.FUN_OPERATION_ENTITY; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.select(funOperationDef.ALL_COLUMNS) + .from(funOperationDef) + .eq(FunOperationEntity::getItemId, req.getItemId()) + .like(FunOperationEntity::getOperationCode, req.getOperationCode(), StrUtil.isNotBlank(req.getOperationCode())) + .like(FunOperationEntity::getFunName, req.getFunName(), StrUtil.isNotBlank(req.getFunName())) + .orderBy(FunOperationEntity::getSortOrder, true); + List funOperationQueryRes = funOperationMapper.selectListByQueryAs(queryWrapper, FunOperationQueryRes.class); + return XResult.ok(funOperationQueryRes); + } /** * 创建/修改操作 */ - @Override - public XResult saveUpdate(FunOperationSaveUpdateReq req) { - // TODO 实现 创建/修改操作 业务逻辑 - return null; - } + @Transactional + @Override + public XResult saveUpdate(FunOperationSaveUpdateReq req) { + Long id = req.getId(); + if (req.getId() != null) { + // 删除原数据 + QueryWrapper deleteOperation = new QueryWrapper(); + deleteOperation.eq(FunOperationEntity::getId, id); + funOperationMapper.deleteByQuery(deleteOperation); + } + id = Long.valueOf(req.getItemId().toString() + req.getOperationId().toString()); + // 模块是否存在 + QueryWrapper queryModule = new QueryWrapper(); + queryModule.eq(FunModuleEntity::getId, req.getModuleId()); + if (funModuleMapper.selectCountByQuery(queryModule) <= 0) { + return XResult.failed("模块不存在"); + } + // 功能是否存在 + QueryWrapper queryItem = new QueryWrapper(); + queryItem.eq(FunItemEntity::getId, req.getItemId()); + if (funItemMapper.selectCountByQuery(queryItem) <= 0) { + return XResult.failed("功能不存在"); + } + // 同一个功能是否存在相同操作ID + QueryWrapper queryOperation = new QueryWrapper(); + queryOperation.eq(FunOperationEntity::getModuleId, req.getModuleId()); + queryOperation.eq(FunOperationEntity::getItemId, req.getItemId()); + queryOperation.eq(FunOperationEntity::getOperationId, req.getOperationId()); + if (req.getId() != null) { + queryOperation.ne(FunOperationEntity::getId, req.getId()); + } + if (funOperationMapper.selectCountByQuery(queryOperation) > 0) { + return XResult.failed("操作ID已存在"); + } + FunOperationEntity funOperationEntity = new FunOperationEntity(); + BeanUtils.copyProperties(req, funOperationEntity); + funOperationEntity.setId(id); + funOperationMapper.insertSelective(funOperationEntity); + return XResult.ok(); + } /** * 删除操作 */ - @Override - public XResult delete() { - // TODO 实现 删除操作 业务逻辑 - return null; - } + @Override + public XResult delete(FunOperationDeleteReq req) { + QueryWrapper deleteWrapper = new QueryWrapper(); + deleteWrapper.in(FunOperationEntity::getId, req.getIdList()); + funOperationMapper.deleteByQuery(deleteWrapper); + return XResult.ok(); + } } \ No newline at end of file