voucher/internal/biz/bo/wechat_notify_bo.go

117 lines
4.2 KiB
Go

package bo
import (
"encoding/json"
"fmt"
"github.com/go-playground/validator/v10"
"time"
"voucher/internal/biz/vo"
)
// ConsumeInformation 定义消费信息结构体
type ConsumeInformation struct {
ConsumeTime time.Time `json:"consume_time" validate:"required"` // 核销时间
ConsumeMchid string `json:"consume_mchid"` // 核销商户号
TransactionID string `json:"transaction_id" validate:"required"` // 微信支付交易单号
ConsumeAmount int `json:"consume_amount"` // 核销金额(单位:分) // 多笔立减金必须 validate:"required"
}
// CombineSubOrder 定义合单子单消费信息结构体
type CombineSubOrder struct {
TransactionID string `json:"transaction_id" validate:"required"` // 合单子单微信支付订单号
ConsumeAmount int `json:"comsume_amount" validate:"required"` // 子单核销金额,微信文档字段名如此定义
ConsumeTime time.Time `json:"consume_time" validate:"required"` // 子单核销时间
}
// CombineOrderInfo 定义合单订单信息结构体
type CombineOrderInfo struct {
CombineConsumeAmount int `json:"combine_consume_amount"` // 合单总核销金额
SubOrders []CombineSubOrder `json:"sub_orders,omitempty"` // 合单子单列表
}
// PlainText 定义明文数据结构体
type PlainText struct {
StockCreatorMchid string `json:"stock_creator_mchid" validate:"required"`
StockID string `json:"stock_id"`
CouponID string `json:"coupon_id"`
CouponName string `json:"coupon_name"`
Description string `json:"description"`
Status vo.WechatVoucherStatus `json:"status"`
CreateTime time.Time `json:"create_time" validate:"required"`
CouponType string `json:"coupon_type"`
NoCash bool `json:"no_cash"`
Singleitem bool `json:"singleitem"`
BusinessType string `json:"business_type"` // 业务类型
IsCombineOrder bool `json:"is_combine_order,omitempty"`
ConsumeInformation *ConsumeInformation `json:"consume_information,omitempty"`
CombineOrderInfo *CombineOrderInfo `json:"combine_order_info,omitempty"`
}
type WechatVoucherNotifyBo struct {
ID string `json:"id" validate:"required"`
CreateTime string `json:"create_time"`
ResourceType string `json:"resource_type"`
EventType string `json:"event_type" validate:"required"`
Summary string `json:"summary"`
OriginalType string `json:"original_type"`
AssociatedData string `json:"associated_data"`
PlainText PlainText `json:"plain_text" validate:"required"`
}
func (d *WechatVoucherNotifyBo) Str() (string, error) {
b, err := json.Marshal(d)
if err != nil {
return "", fmt.Errorf("json marshal original_data error: %v", err)
}
return string(b), nil
}
func (c *WechatVoucherNotifyBo) Validate() error {
if err := validator.New().Struct(c); err != nil {
for _, err = range err.(validator.ValidationErrors) {
return err
}
}
return nil
}
func (c *WechatVoucherNotifyBo) ValidateMultiNotify() error {
if err := c.Validate(); err != nil {
return err
}
if c.PlainText.IsCombineOrder {
if c.PlainText.CombineOrderInfo == nil {
return fmt.Errorf("合单订单信息不能为空")
}
if len(c.PlainText.CombineOrderInfo.SubOrders) == 0 {
return fmt.Errorf("合单子单不能为空")
}
for _, subOrder := range c.PlainText.CombineOrderInfo.SubOrders {
if subOrder.TransactionID == "" {
return fmt.Errorf("合单子单微信支付订单号不能为空")
}
if subOrder.ConsumeAmount <= 0 {
return fmt.Errorf("合单子单核销金额必须大于0")
}
if subOrder.ConsumeTime.IsZero() {
return fmt.Errorf("合单子单核销时间不能为空")
}
}
return nil
}
if c.PlainText.ConsumeInformation == nil {
return fmt.Errorf("消费信息不能为空")
}
if c.PlainText.ConsumeInformation.ConsumeAmount <= 0 {
return fmt.Errorf("消费金额必须大于0")
}
return nil
}