kra/internal/server/handler/system/sys_dictionary_detail.go

362 lines
12 KiB
Go

package system
import (
"strconv"
"kra/internal/biz/system"
"kra/pkg/response"
"github.com/gin-gonic/gin"
)
type DictionaryDetailApi struct{}
// DictionaryDetailRequest 字典详情请求
type DictionaryDetailRequest struct {
ID uint `json:"id"`
Label string `json:"label"`
Value string `json:"value"`
Extend string `json:"extend"`
Status *bool `json:"status"`
Sort int `json:"sort"`
SysDictionaryID uint `json:"sysDictionaryID"`
ParentID *uint `json:"parentId"`
}
// DictionaryDetailSearchRequest 字典详情搜索请求
type DictionaryDetailSearchRequest struct {
Page int `json:"page" form:"page"`
PageSize int `json:"pageSize" form:"pageSize"`
Label string `json:"label" form:"label"`
Value string `json:"value" form:"value"`
Status *bool `json:"status" form:"status"`
SysDictionaryID uint `json:"sysDictionaryID" form:"sysDictionaryID"`
ParentID *uint `json:"parentId" form:"parentId"`
Level *int `json:"level" form:"level"`
}
// GetDictionaryDetailsByParentRequest 根据父级获取字典详情请求
type GetDictionaryDetailsByParentRequest struct {
SysDictionaryID uint `json:"sysDictionaryID" form:"sysDictionaryID" binding:"required"`
ParentID *uint `json:"parentId" form:"parentId"`
IncludeChildren bool `json:"includeChildren" form:"includeChildren"`
}
// CreateSysDictionaryDetail
// @Tags SysDictionaryDetail
// @Summary 创建SysDictionaryDetail
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body DictionaryDetailRequest true "SysDictionaryDetail模型"
// @Success 200 {object} response.Response{msg=string} "创建SysDictionaryDetail"
// @Router /sysDictionaryDetail/createSysDictionaryDetail [post]
func (d *DictionaryDetailApi) CreateSysDictionaryDetail(c *gin.Context) {
var req DictionaryDetailRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
detail := &system.DictionaryDetail{
Label: req.Label,
Value: req.Value,
Extend: req.Extend,
Status: req.Status,
Sort: req.Sort,
SysDictionaryID: req.SysDictionaryID,
ParentID: req.ParentID,
}
if err := dictionaryUsecase.CreateDictionaryDetail(c.Request.Context(), detail); err != nil {
response.FailWithMessage("创建失败:"+err.Error(), c)
return
}
response.OkWithMessage("创建成功", c)
}
// DeleteSysDictionaryDetail
// @Tags SysDictionaryDetail
// @Summary 删除SysDictionaryDetail
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body DictionaryDetailRequest true "SysDictionaryDetail模型"
// @Success 200 {object} response.Response{msg=string} "删除SysDictionaryDetail"
// @Router /sysDictionaryDetail/deleteSysDictionaryDetail [delete]
func (d *DictionaryDetailApi) DeleteSysDictionaryDetail(c *gin.Context) {
var req DictionaryDetailRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
if err := dictionaryUsecase.DeleteDictionaryDetail(c.Request.Context(), req.ID); err != nil {
response.FailWithMessage("删除失败:"+err.Error(), c)
return
}
response.OkWithMessage("删除成功", c)
}
// UpdateSysDictionaryDetail
// @Tags SysDictionaryDetail
// @Summary 更新SysDictionaryDetail
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body DictionaryDetailRequest true "更新SysDictionaryDetail"
// @Success 200 {object} response.Response{msg=string} "更新SysDictionaryDetail"
// @Router /sysDictionaryDetail/updateSysDictionaryDetail [put]
func (d *DictionaryDetailApi) UpdateSysDictionaryDetail(c *gin.Context) {
var req DictionaryDetailRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
detail := &system.DictionaryDetail{
ID: req.ID,
Label: req.Label,
Value: req.Value,
Extend: req.Extend,
Status: req.Status,
Sort: req.Sort,
SysDictionaryID: req.SysDictionaryID,
ParentID: req.ParentID,
}
if err := dictionaryUsecase.UpdateDictionaryDetail(c.Request.Context(), detail); err != nil {
response.FailWithMessage("更新失败:"+err.Error(), c)
return
}
response.OkWithMessage("更新成功", c)
}
// FindSysDictionaryDetail
// @Tags SysDictionaryDetail
// @Summary 用id查询SysDictionaryDetail
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param ID query string true "用id查询SysDictionaryDetail"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "用id查询SysDictionaryDetail"
// @Router /sysDictionaryDetail/findSysDictionaryDetail [get]
func (d *DictionaryDetailApi) FindSysDictionaryDetail(c *gin.Context) {
idStr := c.Query("ID")
if idStr == "" {
response.FailWithMessage("缺少参数: ID", c)
return
}
id, _ := strconv.ParseUint(idStr, 10, 32)
detail, err := dictionaryUsecase.GetDictionaryDetail(c.Request.Context(), uint(id))
if err != nil {
response.FailWithMessage("查询失败:"+err.Error(), c)
return
}
response.OkWithDetailed(gin.H{"reSysDictionaryDetail": toDictionaryDetailResponse(detail)}, "查询成功", c)
}
// GetSysDictionaryDetailList
// @Tags SysDictionaryDetail
// @Summary 分页获取SysDictionaryDetail列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data query DictionaryDetailSearchRequest true "页码, 每页大小, 搜索条件"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页获取SysDictionaryDetail列表,返回包括列表,总数,页码,每页数量"
// @Router /sysDictionaryDetail/getSysDictionaryDetailList [get]
func (d *DictionaryDetailApi) GetSysDictionaryDetailList(c *gin.Context) {
var req DictionaryDetailSearchRequest
if err := c.ShouldBindQuery(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 10
}
filters := make(map[string]interface{})
if req.Label != "" {
filters["label"] = req.Label
}
if req.Value != "" {
filters["value"] = req.Value
}
if req.Status != nil {
filters["status"] = req.Status
}
if req.SysDictionaryID != 0 {
filters["sysDictionaryID"] = req.SysDictionaryID
}
if req.ParentID != nil {
filters["parentId"] = req.ParentID
}
if req.Level != nil {
filters["level"] = req.Level
}
list, total, err := dictionaryUsecase.GetDictionaryDetailList(c.Request.Context(), req.Page, req.PageSize, filters)
if err != nil {
response.FailWithMessage("获取失败:"+err.Error(), c)
return
}
result := make([]map[string]interface{}, len(list))
for i, item := range list {
result[i] = toDictionaryDetailResponse(item)
}
response.OkWithDetailed(response.PageResult{
List: result,
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}, "获取成功", c)
}
// GetDictionaryTreeList
// @Tags SysDictionaryDetail
// @Summary 获取字典详情树形结构
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param sysDictionaryID query int true "字典ID"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取字典详情树形结构"
// @Router /sysDictionaryDetail/getDictionaryTreeList [get]
func (d *DictionaryDetailApi) GetDictionaryTreeList(c *gin.Context) {
sysDictionaryID := c.Query("sysDictionaryID")
if sysDictionaryID == "" {
response.FailWithMessage("字典ID不能为空", c)
return
}
id, err := strconv.ParseUint(sysDictionaryID, 10, 32)
if err != nil {
response.FailWithMessage("字典ID格式错误", c)
return
}
list, err := dictionaryUsecase.GetDictionaryTreeList(c.Request.Context(), uint(id))
if err != nil {
response.FailWithMessage("获取失败:"+err.Error(), c)
return
}
response.OkWithDetailed(gin.H{"list": toDictionaryDetailTreeResponse(list)}, "获取成功", c)
}
// GetDictionaryTreeListByType
// @Tags SysDictionaryDetail
// @Summary 根据字典类型获取字典详情树形结构
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param type query string true "字典类型"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取字典详情树形结构"
// @Router /sysDictionaryDetail/getDictionaryTreeListByType [get]
func (d *DictionaryDetailApi) GetDictionaryTreeListByType(c *gin.Context) {
dictType := c.Query("type")
if dictType == "" {
response.FailWithMessage("字典类型不能为空", c)
return
}
list, err := dictionaryUsecase.GetDictionaryTreeListByType(c.Request.Context(), dictType)
if err != nil {
response.FailWithMessage("获取失败:"+err.Error(), c)
return
}
response.OkWithDetailed(gin.H{"list": toDictionaryDetailTreeResponse(list)}, "获取成功", c)
}
// GetDictionaryDetailsByParent
// @Tags SysDictionaryDetail
// @Summary 根据父级ID获取字典详情
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data query GetDictionaryDetailsByParentRequest true "查询参数"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取字典详情列表"
// @Router /sysDictionaryDetail/getDictionaryDetailsByParent [get]
func (d *DictionaryDetailApi) GetDictionaryDetailsByParent(c *gin.Context) {
var req GetDictionaryDetailsByParentRequest
if err := c.ShouldBindQuery(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
list, err := dictionaryUsecase.GetDictionaryDetailsByParent(c.Request.Context(), req.SysDictionaryID, req.ParentID, req.IncludeChildren)
if err != nil {
response.FailWithMessage("获取失败:"+err.Error(), c)
return
}
response.OkWithDetailed(gin.H{"list": toDictionaryDetailTreeResponse(list)}, "获取成功", c)
}
// GetDictionaryPath
// @Tags SysDictionaryDetail
// @Summary 获取字典详情的完整路径
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param id query uint true "字典详情ID"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取字典详情路径"
// @Router /sysDictionaryDetail/getDictionaryPath [get]
func (d *DictionaryDetailApi) GetDictionaryPath(c *gin.Context) {
idStr := c.Query("id")
if idStr == "" {
response.FailWithMessage("字典详情ID不能为空", c)
return
}
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.FailWithMessage("字典详情ID格式错误", c)
return
}
path, err := dictionaryUsecase.GetDictionaryPath(c.Request.Context(), uint(id))
if err != nil {
response.FailWithMessage("获取失败:"+err.Error(), c)
return
}
result := make([]map[string]interface{}, len(path))
for i, item := range path {
result[i] = toDictionaryDetailResponse(item)
}
response.OkWithDetailed(gin.H{"path": result}, "获取成功", c)
}
func toDictionaryDetailResponse(d *system.DictionaryDetail) map[string]interface{} {
return map[string]interface{}{
"id": d.ID,
"label": d.Label,
"value": d.Value,
"extend": d.Extend,
"status": d.Status,
"sort": d.Sort,
"sysDictionaryID": d.SysDictionaryID,
"parentId": d.ParentID,
"level": d.Level,
"path": d.Path,
"disabled": d.Disabled,
}
}
func toDictionaryDetailTreeResponse(list []*system.DictionaryDetail) []map[string]interface{} {
result := make([]map[string]interface{}, len(list))
for i, item := range list {
resp := toDictionaryDetailResponse(item)
if len(item.Children) > 0 {
resp["children"] = toDictionaryDetailTreeResponse(item.Children)
}
result[i] = resp
}
return result
}