This commit is contained in:
lwl0608 2024-04-16 10:49:02 +08:00
parent 5c01857d28
commit 9fdbd5bcb2
7 changed files with 249 additions and 21 deletions

View File

@ -59,7 +59,23 @@ type RefundOrderData struct {
}
type RefundOrderOpt struct {
ZoneRefundReq *ZoneRefundReq
zoneRefundReq *ZoneRefundReq
}
func NewRefundOrderOpt() *RefundOrderOpt {
return new(RefundOrderOpt)
}
func (p *RefundOrderOpt) SetZoneRefundReq(z *ZoneRefundReq) *RefundOrderOpt {
p.zoneRefundReq = z
return p
}
func (p *RefundOrderOpt) GetZoneRefundReq() *ZoneRefundReq {
if p != nil && p.zoneRefundReq != nil {
return p.zoneRefundReq
}
return nil
}
type RefundCoinOrderReq struct {

View File

@ -311,3 +311,23 @@ func (m *Mysql) GetZoneMemberList(ctx *gin.Context, tx *sqlx.Tx, zid int64, memT
}
return
}
// 空间退款记录
func (m *Mysql) CreateZoneRefundHis(ctx *gin.Context, tx *sqlx.Tx, o *dbstruct.ZoneRefundHis) error {
var err error
sqlStr := "insert into " + TableVasZoneRefundHis +
" (mid, zid, ct, contact_name, contact_phone, note, order_id, product_id) " +
" values (?,?,?,?,?,?,?,?) "
args := []any{o.GetMid(), o.GetZid(), time.Now().Unix(), o.GetContactName(), o.GetContactPhone(), o.GetNote(), o.GetOrderId(), o.GetProductId()}
if tx != nil {
_, err = tx.ExecContext(ctx, sqlStr, args...)
} else {
db := m.getDBVas()
_, err = db.ExecContext(ctx, sqlStr, args...)
}
if err != nil {
logger.Error("CreateZoneRefundHis fail, o: %v, err: %v", util.ToJson(o), err)
return err
}
return nil
}

View File

@ -1957,21 +1957,29 @@ func (v *Vas) RefundOrder(ctx *gin.Context, req *vasproto.RefundOrderReq, opt *v
switch product.Type {
case dbstruct.ProductTypeMoneyMembership:
return v.refundMembership(ctx, order, req)
err = v.refundMembership(ctx, order, req)
case dbstruct.ProductTypeCoins:
return v.refundCoins(ctx, order, req)
err = v.refundCoins(ctx, order, req)
case dbstruct.ProductTypeMoneyContact:
return v.refundMoneyContactWechat(ctx, order, req)
err = v.refundMoneyContactWechat(ctx, order, req)
case dbstruct.ProductTypeZone:
switch product.Id {
case dbstruct.ProductIdH5ZoneAdmission:
return v.refundZoneAdmission(ctx, order, req, opt)
err = v.refundZoneAdmission(ctx, order, req, opt)
default:
return fmt.Errorf("不支持该商品退款: %s", product.Id)
err = fmt.Errorf("不支持该商品退款: %s", product.Id)
}
default:
return fmt.Errorf("不支持该商品退款: %s", product.Id)
err = fmt.Errorf("不支持该商品退款: %s", product.Id)
}
if err != nil {
logger.Error("RefundOrder fail, order: %v, err: %v", util.ToJson(order), err)
return err
}
// todo 回滚铁粉
return nil
}
// 现金:会员退款
@ -2466,9 +2474,24 @@ func (v *Vas) refundZoneAdmission(ctx *gin.Context, order *dbstruct.Order, req *
}
var (
orderId = order.GetID()
isFinish = order.GetOrderStatus() == dbstruct.VasOrderStatusFinish
mid = order.GetMid()
zid = int64(0)
orderId = order.GetID()
isFinish = order.GetOrderStatus() == dbstruct.VasOrderStatusFinish
zoneRefundReq *vasproto.ZoneRefundReq
)
if opt.GetZoneRefundReq() != nil {
zoneRefundReq = opt.GetZoneRefundReq()
}
if zoneRefundReq == nil {
return fmt.Errorf("zoneRefundReq is nil, order_id: %v", orderId)
}
zid = zoneRefundReq.Zid
// 和订单的zid不匹配
if order.GetZid() != zid {
err := fmt.Errorf("与订单的zid不匹配orderZid: %v, reqZid: %v", order.GetZid(), zid)
return err
}
// 开启事务
tx, err := v.store.VasBegin(ctx)
@ -2539,20 +2562,36 @@ func (v *Vas) refundZoneAdmission(ctx *gin.Context, order *dbstruct.Order, req *
}
// 删除空间普通会员
err = v.store.DeleteZoneAdmission(ctx, tx, order.GetMid(), order.GetZid())
err = v.store.DeleteZoneAdmission(ctx, tx, mid, zid)
if err != nil {
logger.Error("DeleteZoneAdmission fail, mid: %v, zid: %v, err: %v", order.GetMid(), order.GetZid(), err)
logger.Error("DeleteZoneAdmission fail, mid: %v, zid: %v, err: %v", mid, zid, err)
return err
}
// 删除空间成员
err = v.store.DeleteZoneMember(ctx, tx, order.GetMid(), order.GetZid(), dbstruct.ZoneMemberTypeNormal)
err = v.store.DeleteZoneMember(ctx, tx, mid, zid, dbstruct.ZoneMemberTypeNormal)
if err != nil {
logger.Error("DeleteZoneMember fail, mid: %v, zid: %v, err: %v", order.GetMid(), order.GetZid(), err)
logger.Error("DeleteZoneMember fail, mid: %v, zid: %v, err: %v", mid, zid, err)
return err
}
// 获取收入记录
// 添加退款记录
zrh := &dbstruct.ZoneRefundHis{
Mid: goproto.Int64(mid),
Zid: goproto.Int64(zid),
ContactName: goproto.String(zoneRefundReq.ContactName),
ContactPhone: goproto.String(zoneRefundReq.ContactPhone),
Note: goproto.String(zoneRefundReq.Note),
OrderId: goproto.String(orderId),
ProductId: goproto.String(order.GetProductId()),
}
err = v.store.CreateZoneRefundHis(ctx, tx, zrh)
if err != nil {
logger.Error("CreateZoneRefundHis fail, zrh: %v, err: %v", util.ToJson(zrh), err)
return err
}
// 回滚收入记录
chListTmp, err := v.store.GetIncomeCHList(ctx, tx, orderId)
if err != nil {
return err

View File

@ -814,7 +814,7 @@ func (v *Vas) ZoneRefund(ctx *gin.Context, req *vasproto.ZoneRefundReq) error {
err = v.RefundOrder(ctx, &vasproto.RefundOrderReq{
OrderId: order.GetID(),
Operator: fmt.Sprintf("%d", req.Mid),
}, &vasproto.RefundOrderOpt{ZoneRefundReq: req})
}, vasproto.NewRefundOrderOpt().SetZoneRefundReq(req))
if err != nil {
logger.Error("RefundOrder fail, mid: %v, zid: %v, orderId: %v, err: %v", req.Mid, req.Zid, order.GetID(), err)
return err

View File

@ -1700,10 +1700,14 @@ func (s *Service) utilFillZoneMomentsWithApiVOInfo(ctx *gin.Context, list []*dbs
}
// 已消费金额
vo.Expenditure = zidZuMap[zid].GetConsume()
if zu, ok := zidZuMap[zid]; ok {
vo.Expenditure = zu.GetConsume()
}
// 铁粉价格
vo.IronfanshipPrice = zvMap[zid].IronfanshipPrice
if zv, ok := zvMap[zid]; ok {
vo.IronfanshipPrice = zv.IronfanshipPrice
}
}
return

View File

@ -171,4 +171,77 @@ CREATE TABLE `vas_user_membership_unlock`
PRIMARY KEY (`id`)
);
CREATE INDEX ix_mid_product_id ON vas_user_membership_unlock (mid, product_id);
CREATE INDEX ix_orderid ON vas_user_membership_unlock (order_id);
CREATE INDEX ix_orderid ON vas_user_membership_unlock (order_id);
-- 用户解锁空间详情
CREATE TABLE `vas_zone_unlock`
(
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`consume` bigint DEFAULT 0 COMMENT '空间总消费',
`admission_ct` bigint DEFAULT 0 COMMENT '普通会员开通时间',
`admission_until` bigint DEFAULT 0 COMMENT '普通会员到期时间,时间戳,-1: 永久',
`admission_order_id` varchar(128) DEFAULT NULL COMMENT '普通会员订单',
`ironfanship_ct` bigint DEFAULT 0 COMMENT '铁粉开通时间',
`ironfanship_until` bigint DEFAULT 0 COMMENT '铁粉到期时间,时间戳,-1: 永久',
`ironfanship_order_id` varchar(128) DEFAULT NULL COMMENT '铁粉订单',
`superfanship_ct` bigint DEFAULT 0 COMMENT '超粉开通时间',
`superfanship_until` bigint DEFAULT 0 COMMENT '超粉到期时间,时间戳,-1: 永久',
`superfanship_order_id` varchar(128) DEFAULT NULL COMMENT '超粉订单id',
PRIMARY KEY (`id`)
);
-- 空间消费详情
CREATE TABLE `vas_zone_ch`
(
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`consume` bigint DEFAULT 0 COMMENT '单笔消费',
`ct` bigint DEFAULT 0 COMMENT '解锁时间',
`order_id` varchar(128) DEFAULT NULL COMMENT '绑定的订单id',
`product_id` varchar(128) DEFAULT NULL COMMENT '商品id',
PRIMARY KEY (`id`)
);
-- 空间成员列表
CREATE TABLE `vas_zone_member`
(
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`consume` bigint DEFAULT 0 COMMENT '单笔消费',
`ct` bigint DEFAULT 0 COMMENT '解锁时间',
`order_id` varchar(128) DEFAULT NULL COMMENT '绑定的订单id',
`product_id` varchar(128) DEFAULT NULL COMMENT '商品id',
PRIMARY KEY (`id`)
);
-- 空间动态解锁
CREATE TABLE `vas_zone_moment_unlock`
(
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`moment_id` bigint NOT NULL COMMENT '动态id',
`status` int NOT NULL COMMENT '状态',
`ct` bigint DEFAULT 0 COMMENT '解锁时间',
`order_id` varchar(128) DEFAULT NULL COMMENT '绑定的订单id',
PRIMARY KEY (`id`)
);
-- 空间退款记录
CREATE TABLE `vas_zone_refund_his`
(
`id` bigint AUTO_INCREMENT COMMENT 'id',
`mid` bigint NOT NULL COMMENT '用户id',
`zid` bigint NOT NULL COMMENT '空间id',
`ct` bigint DEFAULT 0 COMMENT '解锁时间',
`contact_name` varchar(128) DEFAULT NULL COMMENT '联系方式',
`contact_phone` varchar(128) DEFAULT NULL COMMENT '联系电话',
`note` varchar(1024) DEFAULT NULL COMMENT '备注',
`order_id` varchar(128) DEFAULT NULL COMMENT '绑定的订单id',
`product_id` varchar(128) DEFAULT NULL COMMENT '商品id',
PRIMARY KEY (`id`)
);

View File

@ -939,10 +939,10 @@ type ZoneUnlock struct {
AdmissionCt *int64 `json:"admission_ct" db:"admission_ct"` // 普通会员开通时间
AdmissionUntil *int64 `json:"admission_until" db:"admission_until"` // 普通会员到期时间,时间戳,-1: 永久
AdmissionOrderId *string `json:"admission_order_id" db:"admission_order_id"` // 普通会员订单
IronfanshipCt *int64 `json:"ironfanship_ct" db:"ironfanship_ct"` // 铁粉开通时间id
IronfanshipCt *int64 `json:"ironfanship_ct" db:"ironfanship_ct"` // 铁粉开通时间
IronfanshipUntil *int64 `json:"ironfanship_until" db:"ironfanship_until"` // 铁粉到期时间,时间戳,-1永久
IronfanshipOrderId *string `json:"ironfanship_order_id" db:"ironfanship_order_id"` // 铁粉订单
SuperfanshipCt *int64 `json:"superfanship_ct" db:"superfanship_ct"` // 超粉开通时间id
SuperfanshipCt *int64 `json:"superfanship_ct" db:"superfanship_ct"` // 超粉开通时间
SuperfanshipUntil *int64 `json:"superfanship_until" db:"superfanship_until"` // 超粉到期时间,时间戳,-1永久
SuperfanshipOrderId *string `json:"superfanship_order_id" db:"superfanship_order_id"` // 超粉订单id
}
@ -1073,7 +1073,7 @@ type ZoneConsumeHis struct {
Id *int64 `json:"id" db:"id"`
Mid *int64 `json:"mid" db:"mid"` // 用户mid
Zid *int64 `json:"zid" db:"zid"` // 空间id
Consume *int64 `json:"consume" db:"consume"` // 空间总消费
Consume *int64 `json:"consume" db:"consume"` // 单笔消费
Ct *int64 `json:"ct" db:"ct"` // 解锁时间
OrderId *string `json:"order_id" db:"order_id"` // 绑定的订单id
ProductId *string `json:"product_id" db:"product_id"` // 商品id
@ -1249,3 +1249,79 @@ func (p *ZoneMomentUnlock) GetOrderId() string {
}
return ""
}
// 空间退款记录
type ZoneRefundHis struct {
Id *int64 `json:"id" db:"id"`
Mid *int64 `json:"mid" db:"mid"` // 用户id
Zid *int64 `json:"zid" db:"zid"` // 空间id
Ct *int64 `json:"ct" db:"ct"` // 解锁时间
ContactName *string `json:"contact_name" db:"contact_name"` // 联系方式
ContactPhone *string `json:"contact_phone" db:"contact_phone"` // 联系电话
Note *string `json:"note" db:"note"` // 备注
OrderId *string `json:"order_id" db:"order_id"` // 绑定的订单id
ProductId *string `json:"product_id" db:"product_id"` // 商品id
}
func (p *ZoneRefundHis) GetId() int64 {
if p != nil && p.Id != nil {
return *p.Id
}
return 0
}
func (p *ZoneRefundHis) GetMid() int64 {
if p != nil && p.Mid != nil {
return *p.Mid
}
return 0
}
func (p *ZoneRefundHis) GetZid() int64 {
if p != nil && p.Zid != nil {
return *p.Zid
}
return 0
}
func (p *ZoneRefundHis) GetCt() int64 {
if p != nil && p.Ct != nil {
return *p.Ct
}
return 0
}
func (p *ZoneRefundHis) GetContactName() string {
if p != nil && p.ContactName != nil {
return *p.ContactName
}
return ""
}
func (p *ZoneRefundHis) GetContactPhone() string {
if p != nil && p.ContactPhone != nil {
return *p.ContactPhone
}
return ""
}
func (p *ZoneRefundHis) GetNote() string {
if p != nil && p.Note != nil {
return *p.Note
}
return ""
}
func (p *ZoneRefundHis) GetOrderId() string {
if p != nil && p.OrderId != nil {
return *p.OrderId
}
return ""
}
func (p *ZoneRefundHis) GetProductId() string {
if p != nil && p.ProductId != nil {
return *p.ProductId
}
return ""
}