Files
yunzerwebsiteallinone/go/controllers/platform_tenant_apply.go
T
2026-10-19 01:13:17 +08:00

211 lines
5.8 KiB
Go

package controllers
import (
"encoding/json"
"fmt"
"io"
"strconv"
"strings"
"server/models"
"server/pkg/identity"
"server/pkg/jwtutil"
"server/services"
authsvc "server/services/auth"
beego "github.com/beego/beego/v2/server/web"
)
// PlatformTenantApplyController 平台端「企业创建审核」
// 审批注册用户提交的创建企业申请:通过 → 自动建租户并把申请人绑定为租户管理员。
type PlatformTenantApplyController struct {
beego.Controller
}
// platformClaims 入驻申请的审核接口只在平台端使用:必须是 platform 端令牌。
// 此前不判端,租户自己的令牌就能批准自己入驻,等于把审核权下发到了被审核方。
func (c *PlatformTenantApplyController) platformClaims() (*jwtutil.Claims, error) {
return identity.Claims(c.Ctx.Request.Header.Get("Authorization"), identity.EndPlatform)
}
func (c *PlatformTenantApplyController) jsonErr(httpStatus, bizCode int, msg string) {
c.Ctx.Output.SetStatus(httpStatus)
c.Data["json"] = map[string]interface{}{"code": bizCode, "msg": msg}
_ = c.ServeJSON()
}
func (c *PlatformTenantApplyController) readJSON(v interface{}) bool {
body := c.Ctx.Input.RequestBody
if len(body) == 0 {
var err error
body, err = io.ReadAll(c.Ctx.Request.Body)
if err != nil || len(body) == 0 {
c.jsonErr(400, 400, "参数错误")
return false
}
}
if err := json.Unmarshal(body, v); err != nil {
c.jsonErr(400, 400, "参数错误")
return false
}
return true
}
// reviewerName 平台审核人姓名
func (c *PlatformTenantApplyController) reviewerName(claims *jwtutil.Claims) string {
var admin models.AdminUser
if err := models.Orm.QueryTable(new(models.AdminUser)).
Filter("id", claims.UserID).
One(&admin); err == nil && admin.Name != nil && strings.TrimSpace(*admin.Name) != "" {
return strings.TrimSpace(*admin.Name)
}
return claims.Username
}
// List GET /platform/tenantApply/list?page=1&pageSize=20&type=&status=
func (c *PlatformTenantApplyController) List() {
claims, err := c.platformClaims()
if err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
_ = claims
page, _ := c.GetInt("page", 1)
pageSize, _ := c.GetInt("pageSize", 20)
if page < 1 {
page = 1
}
if pageSize < 1 {
pageSize = 20
}
var applyType *int8
if s := strings.TrimSpace(c.GetString("type")); s != "" {
if v, e := strconv.ParseInt(s, 10, 8); e == nil {
tmp := int8(v)
applyType = &tmp
}
}
var status *int8
if s := strings.TrimSpace(c.GetString("status")); s != "" {
if v, e := strconv.ParseInt(s, 10, 8); e == nil {
tmp := int8(v)
status = &tmp
}
}
rows, total, err := services.ListTenantAppliesForPlatform(applyType, status, page, pageSize)
if err != nil {
c.jsonErr(500, 500, "获取申请列表失败")
return
}
type applyDTO struct {
models.AuthTenantApply
IdentityNickname string `json:"identity_nickname"`
IdentityMobile string `json:"identity_mobile"`
}
list := make([]applyDTO, 0, len(rows))
for _, r := range rows {
dto := applyDTO{AuthTenantApply: r}
if ident, ierr := authsvc.GetIdentityByID(r.IdentityID); ierr == nil && ident != nil {
if ident.Nickname != nil {
dto.IdentityNickname = *ident.Nickname
}
if ident.Mobile != nil {
dto.IdentityMobile = *ident.Mobile
}
}
list = append(list, dto)
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": map[string]interface{}{"list": list, "total": total},
}
_ = c.ServeJSON()
}
// Detail GET /platform/tenantApply/detail/:id
func (c *PlatformTenantApplyController) Detail() {
claims, err := c.platformClaims()
if err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
_ = claims
id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64)
if err != nil || id == 0 {
c.jsonErr(400, 400, "无效ID")
return
}
var apply models.AuthTenantApply
if err := models.Orm.QueryTable(new(models.AuthTenantApply)).
Filter("id", id).
Filter("delete_time__isnull", true).
One(&apply); err != nil {
c.jsonErr(404, 404, "申请不存在")
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success", "data": apply}
_ = c.ServeJSON()
}
// Approve POST /platform/tenantApply/approve/:id
func (c *PlatformTenantApplyController) Approve() {
claims, err := c.platformClaims()
if err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64)
if err != nil || id == 0 {
c.jsonErr(400, 400, "无效ID")
return
}
tid, err := services.ApproveCreateApply(id, uint64(claims.UserID), c.reviewerName(claims))
if err != nil {
c.jsonErr(400, 400, err.Error())
return
}
msg := "已通过,租户创建成功,申请人已绑定为该企业管理员"
if tid > 0 {
msg = fmt.Sprintf("已通过:租户已创建(ID:%d),申请人已绑定为企业管理员", tid)
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": msg, "data": map[string]interface{}{"tid": tid}}
_ = c.ServeJSON()
}
// Reject POST /platform/tenantApply/reject/:id { reason }
func (c *PlatformTenantApplyController) Reject() {
claims, err := c.platformClaims()
if err != nil {
code := identity.Status(err)
c.jsonErr(code, code, err.Error())
return
}
_ = claims
id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64)
if err != nil || id == 0 {
c.jsonErr(400, 400, "无效ID")
return
}
var req struct {
Reason string `json:"reason"`
}
if !c.readJSON(&req) {
return
}
if err := services.RejectCreateApply(id, uint64(claims.UserID), c.reviewerName(claims), strings.TrimSpace(req.Reason)); err != nil {
c.jsonErr(400, 400, err.Error())
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "已驳回"}
_ = c.ServeJSON()
}