This commit is contained in:
ziming 2025-05-20 14:17:04 +08:00
parent ad95880eef
commit 0a71346d3b
4 changed files with 202 additions and 0 deletions

View File

@ -0,0 +1,56 @@
package syn_notice
import (
"encoding/json"
v1 "voucher/api/v1"
"voucher/internal/biz/bo"
)
// BBToWechatRequest 蓝色兄弟请求微信发券接口数据同步Api
type BBToWechatRequest struct {
// 微信为每个批次分配的唯一id
StockId string `protobuf:"bytes,9,opt,name=stockId,proto3" json:"stockId,omitempty"`
// 商户此次发放凭据号格式商户id+日期+流水号)
OutRequestNo string `protobuf:"bytes,10,opt,name=outRequestNo,proto3" json:"outRequestNo,omitempty"`
// 微信为发券方商户分配的公众账号ID
AppId string `protobuf:"bytes,11,opt,name=appId,proto3" json:"appId,omitempty"`
// 批次创建方商户号
StockCreatorMhId string `protobuf:"bytes,12,opt,name=stockCreatorMhId,json=stockCreatorMchid,proto3" json:"stockCreatorMhId,omitempty"`
// 券面额,单位:分
CouponValue int32 `protobuf:"bytes,13,opt,name=couponValue,proto3" json:"couponValue,omitempty"`
// 面额发券批次门槛,单位:分
CouponMinimum int32 `protobuf:"bytes,14,opt,name=couponMinimum,proto3" json:"couponMinimum,omitempty"`
// 微信为代金券唯一分配的id, 在微信请求失败时可能为空
CouponId string `protobuf:"bytes,15,opt,name=couponId,proto3" json:"couponId,omitempty"`
// 微信返回结果
WxRes string `protobuf:"bytes,16,opt,name=wxRes,proto3" json:"wxRes,omitempty"`
// 招行返回结果
CmbRes string `protobuf:"bytes,17,opt,name=cmbRes,proto3" json:"cmbRes,omitempty"`
// 招行此次请求的数据的唯一流水号
TransactionId string `protobuf:"bytes,18,opt,name=transactionId,proto3" json:"transactionId,omitempty"`
}
func (this *BBToWechatRequest) SetByMinimum(miniMum int32) {
this.CouponMinimum = miniMum
}
func (this *BBToWechatRequest) SetByOrder(order *bo.OrderBo) {
this.AppId = order.AppID
this.StockId = order.ProductNo
this.OutRequestNo = order.OrderNo
this.StockCreatorMhId = order.MerchantNo
this.CouponId = order.OrderNo
}
func (this *BBToWechatRequest) SetByCmbReply(req *v1.CmbReply) {
b, _ := json.Marshal(req)
this.CmbRes = string(b)
}
func (this *BBToWechatRequest) GetSynNotice() *SynNotice {
return &SynNotice{
OutBizBo: this.TransactionId,
Type: SynNoticeTypeBBToWechat,
BizContent: this,
}
}

View File

@ -0,0 +1,41 @@
package syn_notice
import (
v1 "voucher/api/v1"
)
// CmbToBBRequest 招行请求蓝色兄弟发券接口数据同步Api
type CmbToBBRequest struct {
// 唯一流水号
TransactionId string `protobuf:"bytes,9,opt,name=transactionId,proto3" json:"transactionId,omitempty"`
// 外部合作方权益批次号
ActivityId string `protobuf:"bytes,10,opt,name=activityId,proto3" json:"activityId,omitempty"`
// 招商银行用户号 用户标识比如手机号、支付宝openId
CmbUid string `protobuf:"bytes,11,opt,name=cmbUid,proto3" json:"cmbUid,omitempty"`
// 用户标识类型0-手机号1-支付宝openId
CmbUidType string `protobuf:"bytes,12,opt,name=cmbUidType,proto3" json:"cmbUidType,omitempty"`
// 时间戳长度为13位精度为毫秒
Timestamp string `protobuf:"bytes,13,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
// appId
AppId string `protobuf:"bytes,14,opt,name=appId,proto3" json:"appId,omitempty"`
// 补丁
Attach string `protobuf:"bytes,15,opt,name=attach,proto3" json:"attach,omitempty"`
}
func (this *CmbToBBRequest) SetByBiz(bizContent *v1.CmbOrderRequest) {
this.TransactionId = bizContent.TransactionId
this.ActivityId = bizContent.ActivityId
this.CmbUid = bizContent.CmbUid
this.CmbUidType = bizContent.CmbUidType
this.Timestamp = bizContent.Timestamp
this.AppId = bizContent.AppId
this.Attach = bizContent.Attach
}
func (this *CmbToBBRequest) GetSynNotice() *SynNotice {
return &SynNotice{
OutBizBo: this.TransactionId,
Type: SynNoticeTypeCmbToBB,
BizContent: this,
}
}

View File

@ -0,0 +1,62 @@
package syn_notice
import (
"context"
"encoding/json"
)
var _ SynApiInterface = (*CmbToBBRequest)(nil)
var _ SynApiInterface = (*BBToWechatRequest)(nil)
var _ SynApiInterface = (*WechatToBBRequest)(nil)
type SynApiInterface interface {
GetSynNotice() *SynNotice
}
type SynNotice struct {
OutBizBo string
Type SynNoticeType
BizContent SynApiInterface
}
func (this *SynNotice) Marshal() ([]byte, error) {
return json.Marshal(this)
}
// 上下文键类型,避免命名冲突
type contextKey string
const (
contextCMBToBBKey contextKey = "cmb_to_bb"
contextBBToWXKey contextKey = "bb_to_wx"
)
// SynApi 无状态服务
type SynApi struct{}
// NewSynApi 创建无状态的处理实例
func NewSynApi() *SynApi {
return &SynApi{}
}
// WithCmbTOBB 将 request 存入上下文
func (w *SynApi) WithCmbTOBB(ctx context.Context) context.Context {
return context.WithValue(ctx, contextCMBToBBKey, &CmbToBBRequest{})
}
// GetCmbToBB 从上下文中获取 request
func (w *SynApi) GetCmbToBB(ctx context.Context) (*CmbToBBRequest, bool) {
req, ok := ctx.Value(contextCMBToBBKey).(*CmbToBBRequest)
return req, ok
}
// WithBBToWX 将 request 存入上下文
func (w *SynApi) WithBBToWX(ctx context.Context) context.Context {
return context.WithValue(ctx, contextBBToWXKey, &BBToWechatRequest{})
}
// GetBBToWX 从上下文中获取 request
func (w *SynApi) GetBBToWX(ctx context.Context) (*BBToWechatRequest, bool) {
req, ok := ctx.Value(contextBBToWXKey).(*BBToWechatRequest)
return req, ok
}

View File

@ -0,0 +1,43 @@
package syn_notice
// WechatToBBRequest 微信回调蓝色兄弟接口数据同步Api
type WechatToBBRequest struct {
// 活动ID
ActivityId string `protobuf:"bytes,9,opt,name=activityId,proto3" json:"activityId,omitempty"`
// 活动名称
ActivityName string `protobuf:"bytes,10,opt,name=activityName,proto3" json:"activityName,omitempty"`
// 优惠券ID
VoucherId string `protobuf:"bytes,11,opt,name=voucherId,proto3" json:"voucherId,omitempty"`
// 领取用户ID
UserId string `protobuf:"bytes,12,opt,name=userId,proto3" json:"userId,omitempty"`
// 核销时间Unix时间戳毫秒
UseTime string `protobuf:"bytes,13,opt,name=useTime,proto3" json:"useTime,omitempty"`
// 核销金额(分)
UseAmount string `protobuf:"bytes,14,opt,name=useAmount,proto3" json:"useAmount,omitempty"`
// 券消息类型例如券核销V_USE,V_REFUND
BizType string `protobuf:"bytes,15,opt,name=bizType,proto3" json:"bizType,omitempty"`
// 退款时间Unix时间戳毫秒
RefundTime string `protobuf:"bytes,16,opt,name=refundTime,proto3" json:"refundTime,omitempty"`
// 退款金额(分)
RefundAmount string `protobuf:"bytes,17,opt,name=refundAmount,proto3" json:"refundAmount,omitempty"`
// 券状态可用ENABLED/不可用DISABLED
VoucherStatus string `protobuf:"bytes,18,opt,name=voucherStatus,proto3" json:"voucherStatus,omitempty"`
// 幂等ID
OrderId string `protobuf:"bytes,19,opt,name=orderId,proto3" json:"orderId,omitempty"`
// 支付宝交易号
TradeNo string `protobuf:"bytes,20,opt,name=tradeNo,proto3" json:"tradeNo,omitempty"`
// 券领取时间Unix时间戳毫秒
GmtVoucherCreate string `protobuf:"bytes,21,opt,name=gmtVoucherCreate,proto3" json:"gmtVoucherCreate,omitempty"`
}
func (this *WechatToBBRequest) SetByOrder() {
}
func (this *WechatToBBRequest) GetSynNotice() *SynNotice {
return &SynNotice{
OutBizBo: this.OrderId,
Type: SynNoticeTypeBBToWechat,
BizContent: this,
}
}