diff --git a/internal/biz/syn_notice/bb_to_wechat.go b/internal/biz/syn_notice/bb_to_wechat.go new file mode 100644 index 0000000..36ac1c8 --- /dev/null +++ b/internal/biz/syn_notice/bb_to_wechat.go @@ -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, + } +} diff --git a/internal/biz/syn_notice/cmb_to_bb.go b/internal/biz/syn_notice/cmb_to_bb.go new file mode 100644 index 0000000..8443aa0 --- /dev/null +++ b/internal/biz/syn_notice/cmb_to_bb.go @@ -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, + } +} diff --git a/internal/biz/syn_notice/syn_notice.go b/internal/biz/syn_notice/syn_notice.go new file mode 100644 index 0000000..4e31886 --- /dev/null +++ b/internal/biz/syn_notice/syn_notice.go @@ -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 +} diff --git a/internal/biz/syn_notice/wx_to_bb.go b/internal/biz/syn_notice/wx_to_bb.go new file mode 100644 index 0000000..06c4926 --- /dev/null +++ b/internal/biz/syn_notice/wx_to_bb.go @@ -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, + } +}