All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m42s
292 lines
9.5 KiB
Go
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
|
|
}
|