增加功能报价

This commit is contained in:
2026-09-16 00:22:17 +08:00
parent 71a14c46f9
commit 60b2658d4b
32 changed files with 3578 additions and 77 deletions
+52 -24
View File
@@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"io"
"math"
"strconv"
"strings"
"time"
@@ -32,9 +33,12 @@ type tenantDTO struct {
// 套餐与用户数配额
PackageID uint64 `json:"package_id"`
PackageName string `json:"package_name"`
UserQuota int `json:"user_quota"`
UserUsed int `json:"user_used"`
Remark string `json:"remark"`
// PackageExpireTime 套餐计费到期时间(NULL-永久有效);DaysRemaining 剩余天数
PackageExpireTime *time.Time `json:"package_expire_time"`
DaysRemaining int `json:"days_remaining"`
UserQuota int `json:"user_quota"`
UserUsed int `json:"user_used"`
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"`
@@ -82,6 +86,13 @@ func stringPtr(s string) *string {
func toTenantDTO(t models.SystemTenant) tenantDTO {
ct := t.CreateTime
ut := t.UpdateTime
daysRemaining := 0
if t.PackageExpireTime != nil {
daysRemaining = int(math.Ceil(time.Until(*t.PackageExpireTime).Hours() / 24))
if daysRemaining < 0 {
daysRemaining = 0
}
}
return tenantDTO{
ID: t.ID,
TenantCode: t.TenantCode,
@@ -93,6 +104,8 @@ func toTenantDTO(t models.SystemTenant) tenantDTO {
Worktime: stringValue(t.Worktime),
Status: t.Status,
PackageID: t.PackageID,
PackageExpireTime: t.PackageExpireTime,
DaysRemaining: daysRemaining,
UserQuota: t.UserQuota,
Remark: stringValue(t.Remark),
CreateTime: &ct,
@@ -188,6 +201,11 @@ func (c *PlatformTenantController) GetTenantDetail() {
dto := toTenantDTO(t)
if pkg, err := services.GetTenantPackage(t.ID); err == nil && pkg != nil {
if pkg.ID != t.PackageID {
// 套餐已因到期自动降级,原到期时间不再有效
dto.PackageExpireTime = nil
dto.DaysRemaining = 0
}
dto.PackageID = pkg.ID
dto.PackageName = pkg.Name
}
@@ -293,7 +311,10 @@ func (c *PlatformTenantController) CreateTenant() {
// 套餐与用户数上限:未指定套餐时使用默认套餐,用户数取其包含用户数(兜底 20)
packageID := uint64(0)
userQuota := services.DefaultTenantUserQuota
if p.PackageID != nil && *p.PackageID > 0 {
// 显式选择的套餐按套餐有效时长计费;未指定而兜底绑定默认套餐的不设置到期时间
explicitPackage := p.PackageID != nil && *p.PackageID > 0
var packageExpire *time.Time
if explicitPackage {
packageID = *p.PackageID
}
if packageID == 0 {
@@ -309,8 +330,14 @@ func (c *PlatformTenantController) CreateTenant() {
if err := models.Orm.QueryTable(new(models.SystemTenantPackage)).
Filter("id", packageID).
Filter("delete_time__isnull", true).
One(&pkg); err == nil && pkg.UserQuota > 0 {
userQuota = pkg.UserQuota
One(&pkg); err == nil {
if pkg.UserQuota > 0 {
userQuota = pkg.UserQuota
}
if explicitPackage {
e := services.PackageExpireFromNow(&pkg)
packageExpire = &e
}
}
}
if p.UserQuota != nil && *p.UserQuota > 0 {
@@ -321,17 +348,18 @@ func (c *PlatformTenantController) CreateTenant() {
}
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,
PackageID: packageID,
UserQuota: userQuota,
Remark: stringPtr(p.Remark),
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,
PackageID: packageID,
PackageExpireTime: packageExpire,
UserQuota: userQuota,
Remark: stringPtr(p.Remark),
}
id, err := models.Orm.Insert(&t)
@@ -381,17 +409,17 @@ func (c *PlatformTenantController) EditTenant() {
if p.PackageID != nil {
pkgID := *p.PackageID
if pkgID > 0 {
var pkg models.SystemTenantPackage
if err := models.Orm.QueryTable(new(models.SystemTenantPackage)).
Filter("id", pkgID).
Filter("delete_time__isnull", true).
One(&pkg); err != nil {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": "套餐不存在"}
// 套餐切换/续费:按套餐有效时长重新计费(同套餐未到期在原到期时间上顺延),不动用户数上限
if _, err := services.ApplyPackageToTenant(id, pkgID, false); err != nil {
c.Data["json"] = map[string]interface{}{"code": 400, "msg": err.Error()}
_ = c.ServeJSON()
return
}
} else {
// 解绑套餐:回退未绑定状态(视为默认套餐),清除计费到期时间
update["package_id"] = 0
update["package_expire_time"] = nil
}
update["package_id"] = pkgID
}
if p.UserQuota != nil {
// 用户数上限只增不减:不允许调低到当前已开用户数以下