go-platform/controllers/platform_tenant.go

344 lines
10 KiB
Go
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controllers
import (
"encoding/json"
"io"
"strconv"
"strings"
"time"
"server/models"
beego "github.com/beego/beego/v2/server/web"
)
// PlatformTenantController 平台端租户管ç?
type PlatformTenantController struct {
beego.Controller
}
type tenantDTO struct {
ID uint64 `json:"id"`
TenantCode string `json:"tenant_code"`
TenantName string `json:"tenant_name"`
ContactPerson string `json:"contact_person"`
ContactPhone string `json:"contact_phone"`
ContactEmail string `json:"contact_email"`
Address string `json:"address"`
Worktime string `json:"worktime"`
Status int8 `json:"status"`
Remark string `json:"remark"`
CreateTime *time.Time `json:"create_time,omitempty"`
UpdateTime *time.Time `json:"update_time,omitempty"`
DeleteTime *time.Time `json:"delete_time,omitempty"`
}
func stringValue(s *string) string {
if s == nil {
return ""
}
return *s
}
func stringPtr(s string) *string {
return &s
}
func toTenantDTO(t models.SystemTenant) tenantDTO {
ct := t.CreateTime
ut := t.UpdateTime
return tenantDTO{
ID: t.ID,
TenantCode: t.TenantCode,
TenantName: t.TenantName,
ContactPerson: stringValue(t.ContactPerson),
ContactPhone: stringValue(t.ContactPhone),
ContactEmail: stringValue(t.ContactEmail),
Address: stringValue(t.Address),
Worktime: stringValue(t.Worktime),
Status: t.Status,
Remark: stringValue(t.Remark),
CreateTime: &ct,
UpdateTime: &ut,
DeleteTime: t.DeleteTime,
}
}
// GetTenant 获取租户列表
// GET /platform/tenant/getTenant?page=1&pageSize=10&tenant_name=...&tenant_code=...&contact_person=...&contact_phone=...
func (c *PlatformTenantController) GetTenant() {
page, _ := c.GetInt("page", 1)
pageSize, _ := c.GetInt("pageSize", 10)
if page < 1 {
page = 1
}
if pageSize < 1 {
pageSize = 10
}
tenantName := strings.TrimSpace(c.GetString("tenant_name"))
tenantCode := strings.TrimSpace(c.GetString("tenant_code"))
contactPerson := strings.TrimSpace(c.GetString("contact_person"))
contactPhone := strings.TrimSpace(c.GetString("contact_phone"))
qs := models.Orm.QueryTable(new(models.SystemTenant))
if tenantName != "" {
qs = qs.Filter("tenant_name__icontains", tenantName)
}
if tenantCode != "" {
qs = qs.Filter("tenant_code__icontains", tenantCode)
}
if contactPerson != "" {
qs = qs.Filter("contact_person__icontains", contactPerson)
}
if contactPhone != "" {
qs = qs.Filter("contact_phone__icontains", contactPhone)
}
total, err := qs.Count()
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "获取租户失败: " + err.Error()}
_ = c.ServeJSON()
return
}
var rows []models.SystemTenant
_, err = qs.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&rows)
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "获取租户失败: " + err.Error()}
_ = c.ServeJSON()
return
}
list := make([]tenantDTO, 0, len(rows))
for _, t := range rows {
list = append(list, toTenantDTO(t))
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": map[string]interface{}{
"list": list,
"total": total,
},
}
_ = c.ServeJSON()
}
// GetTenantDetail 获取租户详ćƒ
// GET /platform/tenant/getTenantDetail/:id
func (c *PlatformTenantController) GetTenantDetail() {
id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64)
if err != nil || id == 0 {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": — ć•ˆID"}
_ = c.ServeJSON()
return
}
var t models.SystemTenant
err = models.Orm.QueryTable(new(models.SystemTenant)).Filter("id", id).One(&t)
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 404, "msg": "租户不存在"}
_ = c.ServeJSON()
return
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": toTenantDTO(t),
}
_ = c.ServeJSON()
}
type tenantPayload struct {
TenantCode string `json:"tenant_code"`
TenantName string `json:"tenant_name"`
ContactPerson string `json:"contact_person"`
ContactPhone string `json:"contact_phone"`
ContactEmail string `json:"contact_email"`
Address string `json:"address"`
Worktime string `json:"worktime"`
Status *int8 `json:"status"`
Remark string `json:"remark"`
}
func (c *PlatformTenantController) parseTenantPayload() (tenantPayload, error) {
// 优先从表单读取(createTenant 使用 multipart/form-dataďź?
p := tenantPayload{
TenantCode: strings.TrimSpace(c.GetString("tenant_code")),
TenantName: strings.TrimSpace(c.GetString("tenant_name")),
ContactPerson: strings.TrimSpace(c.GetString("contact_person")),
ContactPhone: strings.TrimSpace(c.GetString("contact_phone")),
ContactEmail: strings.TrimSpace(c.GetString("contact_email")),
Address: strings.TrimSpace(c.GetString("address")),
Worktime: strings.TrimSpace(c.GetString("worktime")),
Remark: strings.TrimSpace(c.GetString("remark")),
}
if s := strings.TrimSpace(c.GetString("status")); s != "" {
if v, err := strconv.ParseInt(s, 10, 8); err == nil {
tmp := int8(v)
p.Status = &tmp
}
}
// 如果关键字段为空,尝试从 JSON body 解析(editTenant 靘莤 JSONďź?
if p.TenantName == "" && p.TenantCode == "" {
raw, _ := io.ReadAll(c.Ctx.Request.Body)
if len(raw) > 0 {
_ = json.Unmarshal(raw, &p)
}
}
return p, nil
}
// CreateTenant 创建租户
// POST /platform/tenant/createTenant
func (c *PlatformTenantController) CreateTenant() {
p, _ := c.parseTenantPayload()
if strings.TrimSpace(p.TenantName) == "" {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": "租户名称不能为空"}
_ = c.ServeJSON()
return
}
if strings.TrimSpace(p.TenantCode) == "" {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": "租户编码不能为空"}
_ = c.ServeJSON()
return
}
// 校验编码唯一
cnt, err := models.Orm.QueryTable(new(models.SystemTenant)).Filter("tenant_code", p.TenantCode).Count()
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "创建失败: " + err.Error()}
_ = c.ServeJSON()
return
}
if cnt > 0 {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": "租户编码已存在"}
_ = c.ServeJSON()
return
}
status := int8(1)
if p.Status != nil {
status = *p.Status
}
t := models.SystemTenant{
TenantCode: p.TenantCode,
TenantName: p.TenantName,
ContactPerson: stringPtr(p.ContactPerson),
ContactPhone: stringPtr(p.ContactPhone),
ContactEmail: stringPtr(p.ContactEmail),
Address: stringPtr(p.Address),
Worktime: stringPtr(p.Worktime),
Status: status,
Remark: stringPtr(p.Remark),
}
id, err := models.Orm.Insert(&t)
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "创建失败: " + err.Error()}
_ = c.ServeJSON()
return
}
c.Data["json"] = map[string]interface{}{
"code": 200,
"msg": "success",
"data": map[string]interface{}{"id": id},
}
_ = c.ServeJSON()
}
// EditTenant 编辑租户
// POST /platform/tenant/editTenant/:id
func (c *PlatformTenantController) EditTenant() {
id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64)
if err != nil || id == 0 {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": — ć•ˆID"}
_ = c.ServeJSON()
return
}
p, _ := c.parseTenantPayload()
if strings.TrimSpace(p.TenantName) == "" {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": "租户名称不能为空"}
_ = c.ServeJSON()
return
}
update := map[string]interface{}{
"tenant_name": p.TenantName,
"contact_person": p.ContactPerson,
"contact_phone": p.ContactPhone,
"contact_email": p.ContactEmail,
"address": p.Address,
"worktime": p.Worktime,
"remark": p.Remark,
}
if p.Status != nil {
update["status"] = *p.Status
}
_, err = models.Orm.QueryTable(new(models.SystemTenant)).Filter("id", id).Update(update)
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "更新失败: " + err.Error()}
_ = c.ServeJSON()
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success"}
_ = c.ServeJSON()
}
// DeleteTenant 删除租户
// DELETE /platform/tenant/deleteTenant/:id
func (c *PlatformTenantController) DeleteTenant() {
id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64)
if err != nil || id == 0 {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": — ć•ˆID"}
_ = c.ServeJSON()
return
}
_, err = models.Orm.QueryTable(new(models.SystemTenant)).Filter("id", id).Delete()
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "删除失败: " + err.Error()}
_ = c.ServeJSON()
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "success"}
_ = c.ServeJSON()
}
// FindTenantCode 校验租户编码是否重复
// GET /platform/tenant/findTenantCode?tenant_code=xxxxxx
// 返回 code=200 表示可用;非200表示重复/不可用(前端会自动重新生成)
func (c *PlatformTenantController) FindTenantCode() {
code := strings.TrimSpace(c.GetString("tenant_code"))
if code == "" {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": "tenant_code 不能为空"}
_ = c.ServeJSON()
return
}
cnt, err := models.Orm.QueryTable(new(models.SystemTenant)).Filter("tenant_code", code).Count()
if err != nil {
c.Data["json"] = map[string]interface{}{"code": 500, "msg": "校验失败: " + err.Error()}
_ = c.ServeJSON()
return
}
if cnt > 0 {
c.Data["json"] = map[string]interface{}{"code": 409, "msg": "租户编码已存在"}
_ = c.ServeJSON()
return
}
c.Data["json"] = map[string]interface{}{"code": 200, "msg": "ok"}
_ = c.ServeJSON()
}