feat:xxl-job 扫描主播审批超时的退款单
This commit is contained in:
parent
e24b88cb3a
commit
5ee947622a
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 "
|
||||
}
|
||||
|
|
|
@ -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"`
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue