diff --git a/api/proto/zone/proto/zone_op.go b/api/proto/zone/proto/zone_op.go index 9d1278d5..d4cd06b1 100644 --- a/api/proto/zone/proto/zone_op.go +++ b/api/proto/zone/proto/zone_op.go @@ -95,3 +95,33 @@ type OpZoneUnlockCollaboratorsParam struct { CollaboratorMids []int64 `json:"collaborator_mids"` // 协作者的mids StreamerMid int64 `json:"streamer_mid"` // 主播的mid } + +type OpZoneRefundListParam struct { + Mid int64 `json:"mid"` // 用户mid + UserId int64 `json:"user_id"` // 用户user_id + Zid int64 `json:"zid"` // 空间id + OrderId string `json:"order_id"` // 订单id + St int64 `json:"st"` // 开始时间戳 + Et int64 `json:"et"` // 结束时间戳 + Offset int `json:"offset"` + Limit int `json:"limit"` +} + +type OpZoneRefundVO struct { + OrderId string `json:"order_id"` // 订单id + OrderStatus int32 `json:"order_status"` // 订单状态 + OrderStatusDesc string `json:"order_status_desc"` // 订单状态描述 + Ct int64 `json:"ct"` // 订单创建时间 + RefundT int64 `json:"refund_t"` // 订单退款时间 + Zid int64 `json:"zid"` // 空间id + ProductName string `json:"product_name"` // 商品名 + Money int64 `json:"money"` // 退款金额 + Mid int64 `json:"mid"` // 购买用户 mid + UserUserId int64 `json:"user_user_id"` // 购买用户 user_id + Uid int64 `json:"uid"` // 主播 mid + StreamerUserId int64 `json:"streamer_user_id"` // 主播 user_id +} + +type OpZoneRefundListData struct { + List []*OpZoneRefundVO `json:"list"` +} diff --git a/app/mix/controller/init.go b/app/mix/controller/init.go index a42ab38d..03baf3b9 100644 --- a/app/mix/controller/init.go +++ b/app/mix/controller/init.go @@ -298,6 +298,7 @@ func Init(r *gin.Engine) { opVasPayGroup.POST("refund_order", middleware.JSONParamValidator(vasproto.RefundOrderReq{}), RefundOrder) opVasPayGroup.POST("refund_coin_order", middleware.JSONParamValidator(vasproto.RefundCoinOrderReq{}), RefundCoinOrder) opVasPayGroup.POST("wxpay_callback_manual", middleware.JSONParamValidator(vasproto.WxpayCallbackManualParam{}), WxpayCallbackManual) + opVasPayGroup.POST("zone_refund_list", middleware.JSONParamValidator(zoneproto.OpZoneRefundListParam{}), OpZoneRefundList) // 验证码 opVeriCodeGroup := r.Group("/op/veri_code", PrepareOp()) diff --git a/app/mix/controller/vas_op.go b/app/mix/controller/vas_op.go index 5769853b..86810680 100644 --- a/app/mix/controller/vas_op.go +++ b/app/mix/controller/vas_op.go @@ -4,6 +4,7 @@ import ( "github.com/gin-gonic/gin" "service/api/errcode" vasproto "service/api/proto/vas/proto" + zoneproto "service/api/proto/zone/proto" "service/app/mix/service" "service/bizcommon/util" "service/library/logger" @@ -42,3 +43,20 @@ func OpOrderList(ctx *gin.Context) { } ReplyOk(ctx, data) } + +func OpZoneRefundList(ctx *gin.Context) { + req := ctx.MustGet("client_req").(*zoneproto.OpZoneRefundListParam) + if req.Limit <= 0 { + req.Limit = 1000 + } + list, ec := service.DefaultService.OpZoneRefundList(ctx, req) + if ec != errcode.ErrCodeVasSrvOk { + logger.Error("OpOrderList fail, req: %v, ec: %v", util.ToJson(req), ec) + ReplyErrCodeMsg(ctx, ec) + return + } + data := &zoneproto.OpZoneRefundListData{ + List: list, + } + ReplyOk(ctx, data) +} diff --git a/app/mix/dao/mysql.go b/app/mix/dao/mysql.go index d0969109..ff7f05b3 100644 --- a/app/mix/dao/mysql.go +++ b/app/mix/dao/mysql.go @@ -232,6 +232,25 @@ func (m *Mysql) GetOrdersByMid(ctx *gin.Context, tx *sqlx.Tx, mid int64, offset, return } +func (m *Mysql) GetOrdersByIds(ctx *gin.Context, tx *sqlx.Tx, ids []string) (list []*dbstruct.Order, err error) { + list = make([]*dbstruct.Order, 0) + sqlStr := fmt.Sprintf("select * from %s where id in (%s)", TableOrder, util.Convert2SqlArr(ids)) + if tx != nil { + err = tx.SelectContext(ctx, &list, sqlStr) + } else { + db := m.getDBVas() + err = db.SelectContext(ctx, &list, sqlStr) + } + if err == sql.ErrNoRows { + err = nil + return + } + if err != nil { + return + } + return +} + // 获取订单 func (m *Mysql) GetOrders(ctx *gin.Context, tx *sqlx.Tx, mid, st, et int64, offset, limit int) (list []*dbstruct.Order, err error) { list = make([]*dbstruct.Order, 0) diff --git a/app/mix/dao/mysql_zone.go b/app/mix/dao/mysql_zone.go index 2988abc3..fc8322a1 100644 --- a/app/mix/dao/mysql_zone.go +++ b/app/mix/dao/mysql_zone.go @@ -462,3 +462,40 @@ func (m *Mysql) CreateZoneRefundHis(ctx *gin.Context, tx *sqlx.Tx, o *dbstruct.Z } return nil } + +// 获取空间退款记录 +func (m *Mysql) GetZoneRefundHisList(ctx *gin.Context, tx *sqlx.Tx, mid, zid int64, orderId string, st, et int64, offset, limit int) (list []*dbstruct.ZoneRefundHis, err error) { + list = make([]*dbstruct.ZoneRefundHis, 0) + var ( + sqlStr string + args = make([]any, 0) + ) + switch { + case mid > 0: + sqlStr = fmt.Sprintf(fmt.Sprintf("select * from %s where mid=? order by ct desc", TableVasZoneRefundHis)) + args = []any{mid} + case zid > 0: + sqlStr = fmt.Sprintf(fmt.Sprintf("select * from %s where zid=? order by ct desc", TableVasZoneRefundHis)) + args = []any{zid} + case len(orderId) > 0: + sqlStr = fmt.Sprintf(fmt.Sprintf("select * from %s where order_id=? order by ct desc", TableVasZoneRefundHis)) + args = []any{orderId} + default: + sqlStr = fmt.Sprintf("select * from %s where ct>=%d and ct<%d limit %d offset %d", TableVasZoneRefundHis, st, et, limit, offset) + } + + if tx != nil { + err = tx.SelectContext(ctx, &list, sqlStr, args...) + } else { + db := m.getDBVas() + err = db.SelectContext(ctx, &list, sqlStr, args...) + } + if err == sql.ErrNoRows { + err = nil + return + } + if err != nil { + return + } + return +} diff --git a/app/mix/service/logic/vas.go b/app/mix/service/logic/vas.go index 0ccc1ac8..b07d1b4b 100644 --- a/app/mix/service/logic/vas.go +++ b/app/mix/service/logic/vas.go @@ -1360,6 +1360,15 @@ func (v *Vas) GetOrderById(ctx *gin.Context, tx *sqlx.Tx, id string) (*dbstruct. return v.store.GetOrderById(ctx, tx, id) } +func (v *Vas) GetOrderMapByIds(ctx *gin.Context, tx *sqlx.Tx, ids []string) (map[string]*dbstruct.Order, error) { + m := make(map[string]*dbstruct.Order, 0) + list, _ := v.store.GetOrdersByIds(ctx, tx, ids) + for _, v := range list { + m[v.GetID()] = v + } + return m, nil +} + func (v *Vas) GetOrderCountGroupByStatus(ctx *gin.Context, req *vasproto.GetOrderByStatusReq) ([]*dbstruct.VasOrderStatusCount, error) { return v.store.GetOrderCountGroupByStatus(ctx, nil, req.OrderStatuses, req.CtStart, req.CtEnd) } diff --git a/app/mix/service/logic/vas_op.go b/app/mix/service/logic/vas_op.go index 3e5be25f..5f4ea591 100644 --- a/app/mix/service/logic/vas_op.go +++ b/app/mix/service/logic/vas_op.go @@ -3,6 +3,7 @@ package logic import ( "github.com/gin-gonic/gin" vasproto "service/api/proto/vas/proto" + zoneproto "service/api/proto/zone/proto" "service/dbstruct" ) @@ -23,3 +24,8 @@ func (v *Vas) OpOrderList(ctx *gin.Context, req *vasproto.OpOrderListReq) ([]*db } return v.store.GetOrders(ctx, nil, req.Mid, req.St, req.Et, req.Offset, req.Limit) } + +// 获取订单 +func (v *Vas) OpZoneRefundList(ctx *gin.Context, req *zoneproto.OpZoneRefundListParam) ([]*dbstruct.ZoneRefundHis, error) { + return v.store.GetZoneRefundHisList(ctx, nil, req.Mid, req.Zid, req.OrderId, req.St, req.Et, req.Offset, req.Limit) +} diff --git a/app/mix/service/vasservice.go b/app/mix/service/vasservice.go index cada48c0..f6c896a2 100644 --- a/app/mix/service/vasservice.go +++ b/app/mix/service/vasservice.go @@ -9,6 +9,7 @@ import ( accountproto "service/api/proto/account/proto" vasproto "service/api/proto/vas/proto" vericodeproto "service/api/proto/vericode/proto" + zoneproto "service/api/proto/zone/proto" "service/bizcommon/util" "service/dbstruct" "service/library/logger" @@ -940,3 +941,76 @@ func (s *Service) ZoneExit(ctx *gin.Context, req *vasproto.ZoneExitReq) (ec errc } return } + +func (s *Service) OpZoneRefundList(ctx *gin.Context, req *zoneproto.OpZoneRefundListParam) (list []*zoneproto.OpZoneRefundVO, ec errcode.ErrCode) { + list = make([]*zoneproto.OpZoneRefundVO, 0) + if req.UserId > 0 && req.Mid <= 0 { + a, _ := _DefaultAccount.OpListByUserId(ctx, &accountproto.OpListByUserIdReq{ + UserId: goproto.Int64(req.UserId), + }) + if a != nil && a.Mid != nil { + req.Mid = *a.Mid + } + } + + // 获取空间退款历史 + hisList, err := _DefaultVas.OpZoneRefundList(ctx, req) + ec, err = errs.DealVasErr(err) + if err != nil { + logger.Error("OpZoneRefundList fail, req: %v, err: %v", util.ToJson(req), err) + return + } + + // 获取订单 + orderIds := make([]string, 0) + for _, h := range hisList { + orderIds = append(orderIds, h.GetOrderId()) + } + orderMap, _ := _DefaultVas.GetOrderMapByIds(ctx, nil, orderIds) + + // 获取用户 + mids := make([]int64, 0) + for _, h := range hisList { + mids = append(mids, h.GetMid()) + } + for _, o := range orderMap { + mids = append(mids, o.GetUid()) + } + acntMap, _ := _DefaultAccount.GetAccountMapByMids(ctx, mids) + + // 组装 + for _, h := range hisList { + o := orderMap[h.GetOrderId()] + if o == nil { + continue + } + + var ( + userUserId = int64(0) + streamerUserId = int64(0) + ) + if a, ok := acntMap[o.GetMid()]; ok { + userUserId = util.DerefInt64(a.UserId) + } + if a, ok := acntMap[o.GetUid()]; ok { + streamerUserId = util.DerefInt64(a.UserId) + } + + item := &zoneproto.OpZoneRefundVO{ + OrderId: o.GetID(), + OrderStatus: o.GetOrderStatus(), + OrderStatusDesc: dbstruct.OrderStatusDescMap[o.GetOrderStatus()], + Ct: o.GetCt(), + RefundT: h.GetCt(), + Zid: h.GetZid(), + ProductName: dbstruct.ProductIdDescMap[o.GetProductId()], + Money: o.GetPayAmount(), + Mid: o.GetMid(), + UserUserId: userUserId, + Uid: o.GetUid(), + StreamerUserId: streamerUserId, + } + list = append(list, item) + } + return +}