Files
junhong_cmp_fiber/internal/handler/admin/business_user_group.go
break 22c3e7cc1a
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m42s
实施业务用户组成员管理
2026-09-21 21:20:38 +08:00

292 lines
9.5 KiB
Go

package admin
import (
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
businessusergroupApp "github.com/break/junhong_cmp_fiber/internal/application/businessusergroup"
shopApp "github.com/break/junhong_cmp_fiber/internal/application/shop"
"github.com/break/junhong_cmp_fiber/internal/model/dto"
businessusergroupQuery "github.com/break/junhong_cmp_fiber/internal/query/businessusergroup"
"github.com/break/junhong_cmp_fiber/pkg/constants"
"github.com/break/junhong_cmp_fiber/pkg/errors"
"github.com/break/junhong_cmp_fiber/pkg/middleware"
"github.com/break/junhong_cmp_fiber/pkg/response"
)
// BusinessUserGroupHandler 业务用户组与店铺负责人批量交接处理器。
type BusinessUserGroupHandler struct {
service *businessusergroupApp.Service
query *businessusergroupQuery.Query
batchService *shopApp.BatchBusinessOwnerService
validator *validator.Validate
}
// NewBusinessUserGroupHandler 创建业务用户组处理器。
func NewBusinessUserGroupHandler(service *businessusergroupApp.Service, validator *validator.Validate) *BusinessUserGroupHandler {
return &BusinessUserGroupHandler{service: service, validator: validator}
}
// SetQuery 注入业务用户组读取投影。
func (h *BusinessUserGroupHandler) SetQuery(query *businessusergroupQuery.Query) {
h.query = query
}
// SetBatchService 注入店铺负责人批量交接事务脚本。
func (h *BusinessUserGroupHandler) SetBatchService(service *shopApp.BatchBusinessOwnerService) {
h.batchService = service
}
// Create 创建业务用户组。
// POST /api/admin/business-user-groups
func (h *BusinessUserGroupHandler) Create(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
var request dto.CreateBusinessUserGroupRequest
if err := c.BodyParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
result, err := h.service.Create(c.UserContext(), &request)
if err != nil {
return err
}
return response.Success(c, result)
}
// List 查询业务用户组列表。
// GET /api/admin/business-user-groups
func (h *BusinessUserGroupHandler) List(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
var request dto.BusinessUserGroupListRequest
if err := c.QueryParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
if h.query == nil {
return errors.New(errors.CodeInternalError, "业务用户组查询尚未配置")
}
result, err := h.query.List(c.UserContext(), request)
if err != nil {
return err
}
return response.SuccessWithPagination(c, result.Items, result.Total, result.Page, result.Size)
}
// Detail 查询业务用户组详情。
// GET /api/admin/business-user-groups/:id
func (h *BusinessUserGroupHandler) Detail(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
id, err := pathID(c)
if err != nil {
return err
}
if h.query == nil {
return errors.New(errors.CodeInternalError, "业务用户组查询尚未配置")
}
result, err := h.query.Detail(c.UserContext(), id)
if err != nil {
return err
}
return response.Success(c, result)
}
// Update 更新业务用户组的名称、业务线、排序、启停与备注;编码不可修改。
// PUT /api/admin/business-user-groups/:id
func (h *BusinessUserGroupHandler) Update(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
id, err := pathID(c)
if err != nil {
return err
}
var request dto.UpdateBusinessUserGroupRequest
if err := c.BodyParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
result, err := h.service.Update(c.UserContext(), id, &request)
if err != nil {
return err
}
return response.Success(c, result)
}
// Delete 二次确认删除无成员的业务用户组。
// DELETE /api/admin/business-user-groups/:id
func (h *BusinessUserGroupHandler) Delete(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
id, err := pathID(c)
if err != nil {
return err
}
var request dto.BusinessUserGroupDeleteRequest
if err := c.BodyParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if !request.Confirm {
return errors.New(errors.CodeInvalidParam, "删除业务用户组必须二次确认")
}
if err := h.service.Delete(c.UserContext(), id); err != nil {
return err
}
return response.Success(c, nil)
}
// ListMembers 查询指定业务用户组保留的成员关系。
// GET /api/admin/business-user-groups/:id/members
func (h *BusinessUserGroupHandler) ListMembers(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
var request dto.BusinessUserGroupMemberListParams
if err := c.QueryParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
id, err := pathID(c)
if err != nil {
return err
}
request.ID = id
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
if h.query == nil {
return errors.New(errors.CodeInternalError, "业务用户组成员查询尚未配置")
}
result, err := h.query.ListMembers(c.UserContext(), request.ID, request.BusinessUserGroupMemberListRequest)
if err != nil {
return err
}
return response.SuccessWithPagination(c, result.Items, result.Total, result.Page, result.Size)
}
// ListMemberCandidates 查询指定业务用户组的成员候选。
// GET /api/admin/business-user-groups/:id/member-candidates
func (h *BusinessUserGroupHandler) ListMemberCandidates(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
var request dto.BusinessUserGroupMemberCandidateParams
if err := c.QueryParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
id, err := pathID(c)
if err != nil {
return err
}
request.ID = id
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
if h.query == nil {
return errors.New(errors.CodeInternalError, "业务用户组候选查询尚未配置")
}
result, err := h.query.ListMemberCandidates(c.UserContext(), request.ID, request.BusinessUserGroupMemberCandidateRequest)
if err != nil {
return err
}
return response.SuccessWithPagination(c, result.Items, result.Total, result.Page, result.Size)
}
// AddMembers 增量增加平台用户到指定业务用户组。
// POST /api/admin/business-user-groups/:id/members
func (h *BusinessUserGroupHandler) AddMembers(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
id, err := pathID(c)
if err != nil {
return err
}
var request dto.AddBusinessUserGroupMembersRequest
if err := c.BodyParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
result, err := h.service.AddMembers(c.UserContext(), id, &request)
if err != nil {
return err
}
return response.Success(c, result)
}
// RemoveMembers 从指定业务用户组增量移除成员。
// DELETE /api/admin/business-user-groups/:id/members
func (h *BusinessUserGroupHandler) RemoveMembers(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
id, err := pathID(c)
if err != nil {
return err
}
var request dto.RemoveBusinessUserGroupMembersRequest
if err := c.BodyParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
result, err := h.service.RemoveMembers(c.UserContext(), id, &request)
if err != nil {
return err
}
return response.Success(c, result)
}
// BatchUpdateShopBusinessOwner 勾选店铺批量设置或清空平台业务员负责人。
// PUT /api/admin/shops/business-owner/batch
func (h *BusinessUserGroupHandler) BatchUpdateShopBusinessOwner(c *fiber.Ctx) error {
if err := requirePlatformManagement(c); err != nil {
return err
}
var request dto.BatchUpdateShopBusinessOwnerRequest
if err := c.BodyParser(&request); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate(&request); err != nil {
return errors.New(errors.CodeInvalidParam)
}
if h.batchService == nil {
return errors.New(errors.CodeInternalError, "店铺负责人批量交接服务尚未配置")
}
result, err := h.batchService.Execute(c.UserContext(), &request)
if err != nil {
return err
}
return response.Success(c, result)
}
func (h *BusinessUserGroupHandler) validate(request any) error {
if h.validator == nil {
return errors.New(errors.CodeInternalError)
}
return h.validator.Struct(request)
}
// requirePlatformManagement 校验调用者仅限超级管理员与平台账号,代理与企业统一返回 403。
func requirePlatformManagement(c *fiber.Ctx) error {
userType := middleware.GetUserTypeFromContext(c.UserContext())
if userType != constants.UserTypeSuperAdmin && userType != constants.UserTypePlatform {
return errors.New(errors.CodeForbidden, constants.PlatformManagementForbiddenMessage)
}
return nil
}