Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 支付宝查单把 ACQ.TRADE_NOT_EXIST 当成查单失败,恢复任务永远判为未知,订单停在待支付; 同一套餐再下单时旧单也关不掉,新单无法创建。改为按"渠道无此订单"处理,过支付截止后关闭 - 延期订单详情对未过期的待支付订单返回 qr_content,后台可展示二维码、H5 可继续支付 - 新增作废待支付订单:后台 POST /orders/:id/close、H5 POST /orders/:id/cancel;作废前先查单,已支付则按支付成功办理
192 lines
6.1 KiB
Go
192 lines
6.1 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
packagesilenceapp "github.com/break/junhong_cmp_fiber/internal/application/packagesilence"
|
|
"github.com/break/junhong_cmp_fiber/internal/middleware"
|
|
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
|
packagesilencequery "github.com/break/junhong_cmp_fiber/internal/query/packagesilence"
|
|
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
|
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
|
"github.com/break/junhong_cmp_fiber/pkg/response"
|
|
)
|
|
|
|
// ClientPackageSilenceHandler H5 沉默期延期:资格、试算、自助下单、我的延期订单与沉默期流水。
|
|
// 资产归属由用例按当前客户校验;金额与月数全部由后端计算。
|
|
type ClientPackageSilenceHandler struct {
|
|
extensions *packagesilenceapp.ExtensionService
|
|
query *packagesilencequery.Query
|
|
validator *validator.Validate
|
|
}
|
|
|
|
// NewClientPackageSilenceHandler 创建 H5 沉默期 Handler。
|
|
func NewClientPackageSilenceHandler(extensions *packagesilenceapp.ExtensionService, query *packagesilencequery.Query, validator *validator.Validate) *ClientPackageSilenceHandler {
|
|
return &ClientPackageSilenceHandler{extensions: extensions, query: query, validator: validator}
|
|
}
|
|
|
|
// customerContext 返回当前客户 ID 与跳过后台数据范围的上下文(资产归属另行校验)。
|
|
func (h *ClientPackageSilenceHandler) customerContext(c *fiber.Ctx) (context.Context, uint, error) {
|
|
customerID, ok := middleware.GetCustomerID(c)
|
|
if !ok || customerID == 0 {
|
|
return nil, 0, errors.New(errors.CodeUnauthorized)
|
|
}
|
|
ctx := context.WithValue(c.UserContext(), constants.ContextKeySubordinateShopIDs, []uint{})
|
|
return ctx, customerID, nil
|
|
}
|
|
|
|
func (h *ClientPackageSilenceHandler) validate(req any) error {
|
|
if h.validator == nil {
|
|
return nil
|
|
}
|
|
if err := h.validator.Struct(req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam, "请求参数不合法")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Eligibility 延期资格。GET /api/c/v1/package-silence/eligibility
|
|
func (h *ClientPackageSilenceHandler) Eligibility(c *fiber.Ctx) error {
|
|
var req dto.SilenceEligibilityRequest
|
|
if err := c.QueryParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
if err := h.validate(&req); err != nil {
|
|
return err
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result, err := h.extensions.Eligibility(ctx, req.PackageUsageID, packagesilenceapp.Scope{CustomerID: customerID})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|
|
|
|
// Quote 按天数试算。GET /api/c/v1/package-silence/quote
|
|
func (h *ClientPackageSilenceHandler) Quote(c *fiber.Ctx) error {
|
|
var req dto.SilenceQuoteRequest
|
|
if err := c.QueryParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
if err := h.validate(&req); err != nil {
|
|
return err
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result, err := h.extensions.Quote(ctx, req.PackageUsageID, req.Days, packagesilenceapp.Scope{CustomerID: customerID})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|
|
|
|
// CreateOrder 客户自助下单付费延期。POST /api/c/v1/package-silence/orders
|
|
func (h *ClientPackageSilenceHandler) CreateOrder(c *fiber.Ctx) error {
|
|
var req dto.SilenceOnlineOrderRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
if err := h.validate(&req); err != nil {
|
|
return err
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
req.EvidenceRefs = nil
|
|
result, err := h.extensions.CreateOnlineOrder(ctx, packagesilenceapp.OnlineOrderCommand{
|
|
Request: req, Scope: packagesilenceapp.Scope{CustomerID: customerID}, PayerClientIP: c.IP(),
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|
|
|
|
// ListOrders 我的延期订单。GET /api/c/v1/package-silence/orders
|
|
func (h *ClientPackageSilenceHandler) ListOrders(c *fiber.Ctx) error {
|
|
var req dto.SilenceOrderListRequest
|
|
if err := c.QueryParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result, err := h.query.ListOrders(ctx, packagesilencequery.OrderFilter{Request: req, CustomerID: customerID})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|
|
|
|
// GetOrder 我的延期订单详情。GET /api/c/v1/package-silence/orders/:id
|
|
func (h *ClientPackageSilenceHandler) GetOrder(c *fiber.Ctx) error {
|
|
id, err := c.ParamsInt("id")
|
|
if err != nil || id <= 0 {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result, err := h.query.GetOrder(ctx, uint(id), customerID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|
|
|
|
// CancelOrder 客户作废自己未支付的延期订单。POST /api/c/v1/package-silence/orders/:id/cancel
|
|
func (h *ClientPackageSilenceHandler) CancelOrder(c *fiber.Ctx) error {
|
|
id, err := c.ParamsInt("id")
|
|
if err != nil || id <= 0 {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
var req dto.SilenceOrderCancelRequest
|
|
if len(c.Body()) > 0 {
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result, err := h.extensions.CancelPendingOrder(ctx, packagesilenceapp.CancelOrderCommand{
|
|
OrderID: uint(id), Scope: packagesilenceapp.Scope{CustomerID: customerID}, Reason: req.Reason,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|
|
|
|
// ListRecords 套餐沉默期流水。GET /api/c/v1/package-silence/records
|
|
func (h *ClientPackageSilenceHandler) ListRecords(c *fiber.Ctx) error {
|
|
var req dto.SilenceRecordListRequest
|
|
if err := c.QueryParser(&req); err != nil {
|
|
return errors.New(errors.CodeInvalidParam)
|
|
}
|
|
if err := h.validate(&req); err != nil {
|
|
return err
|
|
}
|
|
ctx, customerID, err := h.customerContext(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result, err := h.extensions.Records(ctx, req.PackageUsageID, packagesilenceapp.Scope{CustomerID: customerID})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return response.Success(c, result)
|
|
}
|