feat:xxl-job 扫描主播审批超时的退款单

This commit is contained in:
wangxinyu 2024-12-06 10:58:02 +08:00
parent e24b88cb3a
commit 5ee947622a
6 changed files with 125 additions and 15 deletions

View File

@ -200,7 +200,7 @@ func ZoneRefundAudit(ctx *gin.Context) {
return
}
if req.RefundsStatus != dbstruct.Refunds_Approved && req.RefundsStatus != dbstruct.Refunds_Rejected {
if req.RefundsStatus != dbstruct.RefundsApproved && req.RefundsStatus != dbstruct.RefundsRejected {
logger.Error("ZoneRefundAudit, RefundsStatus: parameter invalid , req: %v", util.ToJson(req))
ReplyErrCodeMsg(ctx, errcode.ErrCodeBadParam)
return

View File

@ -304,7 +304,7 @@ func (m *Mongo) GetZoneRefundList(ctx *gin.Context, zid int64, refundsStatusList
err := doc.Find(ctx, query).All(&list)
if errors.Is(err, qmgo.ErrNoSuchDocuments) {
err = nil
return nil, nil
return nil, err
}
if err != nil {
return nil, err
@ -334,7 +334,7 @@ func (m *Mongo) GetZoneRefundInfo(ctx *gin.Context, auditId string) (*dbstruct.R
// 用户退款表:主播审核
func (m *Mongo) SetZoneRefundAuditInfo(ctx *gin.Context, auditId string, refundsStatus int64) error {
col := m.GetZoneRefund()
_, err := col.Bulk().UpsertOne(
_, err := col.Bulk().UpdateOne(
qmgo.M{
"_id": auditId,
},
@ -367,3 +367,57 @@ func (m *Mongo) AddZoneRefundAutomatic(ctx *gin.Context, doc *dbstruct.RefundInf
return nil
}
// 用户退款表:主播超过 24 小时未审核列表
func (m *Mongo) GetRefundAudit(ctx *gin.Context) ([]*dbstruct.RefundInfo, error) {
list := make([]*dbstruct.RefundInfo, 0)
col := m.GetZoneRefund()
at := time.Now().Unix() - 24*3600
query := qmgo.M{
"ct": qmgo.M{
"$gte": at - 5*60, // >=
"$lte": at, // <=
},
}
err := col.Find(ctx, query).All(&list)
if errors.Is(err, qmgo.ErrNoSuchDocuments) {
err = nil
return nil, err
}
if err != nil {
return nil, err
}
return list, nil
}
func (m *Mongo) SetRefundAudit(ctx *gin.Context, ids []string) error {
col := m.GetZoneRefund()
query := qmgo.M{
"_id": qmgo.M{
"$in": ids,
},
}
_, err := col.Bulk().UpdateAll(
query,
qmgo.M{
operator.Set: qmgo.M{
"refunds_status": dbstruct.RefundsOvertime,
"ut": time.Now().Unix(),
},
},
).Run(ctx)
if errors.Is(err, qmgo.ErrNoSuchDocuments) {
err = nil
return err
}
if err != nil {
return err
}
return nil
}

View File

@ -87,6 +87,7 @@ func (s *CronService) Init(c any) (exec xxl.Executor, err error) {
exec.RegTask("reload_blocked_from_being_searched_list", s.ReloadBlockedFromBeingSearchedList)
exec.RegTask("clear_auto_response_create_times", s.ClearAutoResponseCreateTimes)
exec.RegTask("clear_veri_code_wrong_times", s.ClearVeriCodeWrongTimes)
exec.RegTask("user_refund_audit_times", s.UserRefundAuditTimes)
exec.LogHandler(customLogHandle)
//注册任务handler

View File

@ -1040,7 +1040,7 @@ func (v *Vas) ZoneRefundV2(ctx *gin.Context, req *vasproto.ZoneRefundReq) error
// [0,2]: 直接退款
// (2,24]: 主播审核,发送消息通知
// (24, ♾️): 不支持页面退款,需要客服处理
refundsStatus := dbstruct.Refunds_Awaiting
refundsStatus := dbstruct.RefundsAwaiting
timeInterval := time.Now().Unix() - order.GetCt()
if timeInterval >= 0 && timeInterval <= 2*3600 {
// 退款
@ -1052,14 +1052,14 @@ func (v *Vas) ZoneRefundV2(ctx *gin.Context, req *vasproto.ZoneRefundReq) error
logger.Error("ZoneRefundV2 RefundOrder fail, mid: %v, zid: %v, orderId: %v, err: %v", req.Mid, req.Zid, order.GetID(), err)
return err
}
refundsStatus = dbstruct.Refunds_Automatic
refundsStatus = dbstruct.RefundsAutomatic
} else if timeInterval > 2*3600 && timeInterval <= 24*3600 {
// refundsStatus = dbstruct.Refunds_Awaiting
// 发送主播审核消息
} else {
refundsStatus = dbstruct.Refunds_Prohibit
refundsStatus = dbstruct.RefundsProhibit
}
refund := &dbstruct.RefundInfo{
@ -1072,6 +1072,7 @@ func (v *Vas) ZoneRefundV2(ctx *gin.Context, req *vasproto.ZoneRefundReq) error
ContactName: req.ContactName,
ContactPhone: req.ContactPhone,
Note: req.Note,
OrderId: order.GetID(),
Ct: time.Now().Unix(),
Ut: time.Now().Unix(),
}
@ -1095,9 +1096,9 @@ func (v *Vas) ZoneRefundV2(ctx *gin.Context, req *vasproto.ZoneRefundReq) error
func (v *Vas) ZoneRefundList(ctx *gin.Context, req *vasproto.ZoneRefundListReq) (list []*dbstruct.RefundInfo, err error) {
refundsStatusList := make([]int64, 0)
if req.AuditType == 1 {
refundsStatusList = append(refundsStatusList, dbstruct.Refunds_Awaiting)
refundsStatusList = append(refundsStatusList, dbstruct.RefundsAwaiting)
} else if req.AuditType == 2 {
refundsStatusList = append(refundsStatusList, dbstruct.Refunds_Approved, dbstruct.Refunds_Rejected, dbstruct.Refunds_Overtime)
refundsStatusList = append(refundsStatusList, dbstruct.RefundsApproved, dbstruct.RefundsRejected, dbstruct.RefundsOvertime)
}
list, err = v.store.GetZoneRefundList(ctx, req.Zid, refundsStatusList)
if err != nil {
@ -1128,7 +1129,7 @@ func (v *Vas) ZoneRefundAudit(ctx *gin.Context, req *vasproto.ZoneRefundAuditReq
return fmt.Errorf("审核订单不存在")
}
if info.RefundsStatus == dbstruct.Refunds_Approved || info.RefundsStatus == dbstruct.Refunds_Rejected || info.RefundsStatus == dbstruct.Refunds_Overtime {
if info.RefundsStatus == dbstruct.RefundsApproved || info.RefundsStatus == dbstruct.RefundsRejected || info.RefundsStatus == dbstruct.RefundsOvertime {
logger.Error("ZoneRefundAudit, refund has been approved, mid: %v, zid: %v, auditId: %v", req.Mid, req.Zid, req.AuditId)
return fmt.Errorf("退款订单已审核")
}
@ -1140,6 +1141,49 @@ func (v *Vas) ZoneRefundAudit(ctx *gin.Context, req *vasproto.ZoneRefundAuditReq
return nil
}
func (v *Vas) UserRefundAuditTimes(ctx *gin.Context) error {
// 查询出超过 24小时未审批的退款单
list, err := v.store.GetRefundAudit(ctx)
if err != nil {
logger.Error("UserRefundAuditTimes GetRefundAudit fail ", err)
return err
}
ids := make([]string, 0)
for _, v := range list {
ids = append(ids, v.AuditId)
}
// 订单自动退款 mongodb 数据修改
err = v.store.SetRefundAudit(ctx, ids)
if err != nil {
logger.Error("UserRefundAuditTimes SetRefundAudit fail ", err)
return err
}
// TODO:wxy, 循环退款?
for _, refundInfo := range list {
req := &vasproto.ZoneRefundReq{
Zid: refundInfo.Zid,
ContactName: refundInfo.ContactName,
ContactPhone: refundInfo.ContactPhone,
Note: refundInfo.Note,
}
// 退款
err = v.RefundOrder(ctx, &vasproto.RefundOrderReq{
OrderId: refundInfo.OrderId,
Operator: fmt.Sprintf("%d", refundInfo.Mid),
}, vasproto.NewRefundOrderOpt().SetZoneRefundReq(req))
if err != nil {
logger.Error("UserRefundAuditTimes RefundOrder fail, mid: %v, zid: %v, orderId: %v, err: %v", refundInfo.Mid, refundInfo.Zid, refundInfo.OrderId, err)
continue
}
}
return nil
}
// 空间成员列表
func (v *Vas) GetZoneMemberList(ctx *gin.Context, zid int64, memType int32) (list []*dbstruct.ZoneMember, err error) {
list, err = v.store.GetZoneMemberList(ctx, nil, zid, memType)

View File

@ -618,3 +618,13 @@ func (s *CronService) ClearVeriCodeWrongTimes(ctx context.Context, param *xxl.Ru
logger.Info("vericode_wrong_times collection has been cleared")
return "vericode_wrong_times collection has been cleared"
}
func (s *CronService) UserRefundAuditTimes(ctx context.Context, param *xxl.RunReq) (msg string) {
logger.Info("task %v param: %v log_id: %v", param.ExecutorHandler, param.ExecutorParams, xxl.Int64ToStr(param.LogID))
logger.Info("user_refund_audit_times collection...")
err := _DefaultVas.UserRefundAuditTimes(&gin.Context{})
if err != nil {
return ""
}
return "user_refund_audit_times collection has been "
}

View File

@ -190,12 +190,12 @@ type WithdrawHis struct {
// 用户退款状态
const (
Refunds_Awaiting int64 = 1 // 待退款
Refunds_Approved int64 = 2 // 主播审核通过
Refunds_Rejected int64 = -1 // 主播审核拒绝
Refunds_Automatic int64 = 3 // 2小时内,自动通过
Refunds_Overtime int64 = 4 // 主播审核超时,自动通过
Refunds_Prohibit int64 = 5 // 超过 24 小时,禁止退款(人工审核退款)
RefundsAwaiting int64 = 1 // 待退款
RefundsApproved int64 = 2 // 主播审核通过
RefundsRejected int64 = -1 // 主播审核拒绝
RefundsAutomatic int64 = 3 // 2小时内,自动通过
RefundsOvertime int64 = 4 // 主播审核超时,自动通过
RefundsProhibit int64 = 5 // 超过 24 小时,禁止退款(人工审核退款)
)
type RefundInfo struct {
@ -210,6 +210,7 @@ type RefundInfo struct {
ContactName string `json:"contact_name" bson:"contact_name"`
ContactPhone string `json:"contact_phone" bson:"contact_phone"`
Note string `json:"note" bson:"note"`
OrderId string `json:"order_id" bson:"order_id"`
Ct int64 `json:"ct" bson:"ct"`
Ut int64 `json:"ut" bson:"ut"`
}