完善购买和套餐功能

This commit is contained in:
2026-09-16 17:26:02 +08:00
parent 898dedd75a
commit b48688cbab
19 changed files with 554 additions and 58 deletions
+33 -1
View File
@@ -325,7 +325,8 @@ func (c *BackendProductPurchaseController) GetMyOrders() {
// GetPackageList GET /backend/package/list
// 租户端可购买套餐列表(仅启用的套餐)
func (c *BackendProductPurchaseController) GetPackageList() {
if _, err := c.claims(); err != nil {
claims, err := c.claims()
if err != nil {
c.jsonErr(401, 401, err.Error())
return
}
@@ -345,6 +346,22 @@ func (c *BackendProductPurchaseController) GetPackageList() {
}
moduleMap := loadPackageModules(ids)
// 该租户已购买过(已支付/已开通)的套餐:用于前端对「仅可购买一次」的体验套餐禁用购买按钮
purchased := map[uint64]bool{}
if tid := uint64(claims.TenantId); tid > 0 && len(ids) > 0 {
var orders []models.PlatformProductOrder
if _, err := models.Orm.QueryTable(new(models.PlatformProductOrder)).
Filter("tid", tid).
Filter("package_id__in", ids).
Filter("status__in", models.ProductOrderStatusPaid, models.ProductOrderStatusActivated).
Filter("delete_time__isnull", true).
All(&orders, "ID", "PackageID"); err == nil {
for _, o := range orders {
purchased[o.PackageID] = true
}
}
}
list := make([]map[string]interface{}, 0, len(rows))
for _, r := range rows {
modules := moduleMap[r.ID]
@@ -361,6 +378,8 @@ func (c *BackendProductPurchaseController) GetPackageList() {
"user_quota": r.UserQuota,
"extra_user_price": r.ExtraUserPrice,
"is_default": r.IsDefault,
"allow_repurchase": r.AllowRepurchase,
"purchased": purchased[r.ID],
"sort": r.Sort,
"status": r.Status,
"remark": r.Remark,
@@ -466,6 +485,19 @@ func (c *BackendProductPurchaseController) CreatePackageOrder() {
c.jsonErr(400, 400, "该套餐未配置价格,请联系平台")
return
}
// 体验套餐(allow_repurchase=0):每个租户仅可购买一次
if pkg.AllowRepurchase == 0 {
cnt, _ := models.Orm.QueryTable(new(models.PlatformProductOrder)).
Filter("tid", tid).
Filter("package_id", pkg.ID).
Filter("status__in", models.ProductOrderStatusPaid, models.ProductOrderStatusActivated).
Filter("delete_time__isnull", true).
Count()
if cnt > 0 {
c.jsonErr(400, 400, "该套餐为体验套餐,每个租户仅可购买一次")
return
}
}
now := time.Now()
order := &models.PlatformProductOrder{