优化交易创建流程,客户管理新增折扣与来源字段及功能

This commit is contained in:
2026-03-27 16:16:55 +08:00
parent 75ad12efb3
commit 7e8d824ba6
26 changed files with 523 additions and 140 deletions

105
web/handlers/coupon.go Normal file
View File

@@ -0,0 +1,105 @@
package handlers
import (
"platform/web/auth"
"platform/web/core"
g "platform/web/globals"
s "platform/web/services"
"github.com/gofiber/fiber/v2"
)
func PageCouponByAdmin(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponRead)
if err != nil {
return err
}
var req core.PageReq
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
list, total, err := s.Coupon.Page(&req)
if err != nil {
return err
}
return c.JSON(core.PageResp{
Total: int(total),
Page: req.GetPage(),
Size: req.GetSize(),
List: list,
})
}
func AllCouponsByAdmin(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponRead)
if err != nil {
return err
}
list, err := s.Coupon.All()
if err != nil {
return err
}
return c.JSON(list)
}
func CreateCoupon(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponWrite)
if err != nil {
return err
}
var req s.CreateCouponData
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.Coupon.Create(req)
if err != nil {
return err
}
return nil
}
func UpdateCoupon(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponWrite)
if err != nil {
return err
}
var req s.UpdateCouponData
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.Coupon.Update(req)
if err != nil {
return err
}
return nil
}
func DeleteCoupon(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponWrite)
if err != nil {
return err
}
var req core.IdReq
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.Coupon.Delete(req.Id)
if err != nil {
return err
}
return nil
}

View File

@@ -643,7 +643,7 @@ func CreateResource(c *fiber.Ctx) error {
}
// 创建套餐
err = s.Resource.CreateResourceByBalance(authCtx.User.ID, time.Now(), req.CreateResourceData)
err = s.Resource.CreateResourceByBalance(authCtx.User, req.CreateResourceData)
if err != nil {
return err
}
@@ -670,28 +670,28 @@ func ResourcePrice(c *fiber.Ctx) error {
}
// 获取套餐价格
sku, err := s.Resource.GetSku(req.CreateResourceData.Code())
if err != nil {
return err
}
// sku, err := s.Resource.GetSku(req.CreateResourceData.Code())
// if err != nil {
// return err
// }
_, amount, discounted, couponApplied, err := s.Resource.GetPrice(sku, req.Count(), nil, nil)
// _, amount, discounted, couponApplied, err := s.Resource.GetPrice(sku, req.Count(), nil, nil)
// if err != nil {
// return err
// }
detail, err := req.TradeDetail(nil)
if err != nil {
return err
}
// 计算折扣
return c.JSON(ResourcePriceResp{
Discount: float32(sku.Discount.Discount) / 100,
Price: amount.StringFixed(2),
Discounted: discounted.StringFixed(2),
CouponApplied: couponApplied.StringFixed(2),
Price: detail.Amount.StringFixed(2),
Discounted: detail.Actual.StringFixed(2),
})
}
type ResourcePriceResp struct {
Price string `json:"price"`
Discount float32 `json:"discounted"`
Discounted string `json:"discounted_price"`
CouponApplied string `json:"coupon_applied"`
Price string `json:"price"`
Discounted string `json:"discounted_price"`
}

View File

@@ -121,8 +121,7 @@ func TradeCreate(c *fiber.Ctx) error {
}
// 处理订单
uid := authCtx.User.ID
result, err := s.Trade.Create(uid, req.CreateTradeData, req.Resource)
result, err := s.Trade.Create(authCtx.User, req.CreateTradeData, req.Resource)
if err != nil {
return core.NewServErr("处理购买产品信息失败", err)
}

View File

@@ -28,8 +28,14 @@ func PageUserByAdmin(c *fiber.Ctx) error {
// 构建查询条件
do := q.User.Where()
if req.Phone != nil {
do = do.Where(q.User.Phone.Eq(*req.Phone))
if req.Account != nil {
do = do.Where(q.User.Where(
q.User.Username.Like("%" + *req.Account + "%"),
).Or(
q.User.Phone.Like("%" + *req.Account + "%"),
).Or(
q.User.Email.Like("%" + *req.Account + "%"),
))
}
if req.Name != nil {
do = do.Where(q.User.Name.Eq(*req.Name))
@@ -57,7 +63,7 @@ func PageUserByAdmin(c *fiber.Ctx) error {
}
// 查询用户列表
users, total, err := q.User.
users, total, err := q.User.Debug().
Preload(q.User.Admin).
Omit(q.User.Password).
Where(do).
@@ -85,7 +91,7 @@ func PageUserByAdmin(c *fiber.Ctx) error {
type PageUserByAdminReq struct {
core.PageReq
Phone *string `json:"phone,omitempty" validate:"omitempty,number"`
Account *string `json:"account,omitempty"`
Name *string `json:"name,omitempty"`
Identified *bool `json:"identified,omitempty"`
Enabled *bool `json:"enabled,omitempty"`