diff --git a/app/mix/controller/zone_vas_api.go b/app/mix/controller/zone_vas_api.go index a5079cae..b4621489 100644 --- a/app/mix/controller/zone_vas_api.go +++ b/app/mix/controller/zone_vas_api.go @@ -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 diff --git a/app/mix/dao/mongo_vas.go b/app/mix/dao/mongo_vas.go index 5bc7be1c..bb25d11f 100644 --- a/app/mix/dao/mongo_vas.go +++ b/app/mix/dao/mongo_vas.go @@ -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 +} diff --git a/app/mix/service/cronservice.go b/app/mix/service/cronservice.go index 5119a304..af9e2289 100644 --- a/app/mix/service/cronservice.go +++ b/app/mix/service/cronservice.go @@ -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 diff --git a/app/mix/service/logic/vas_zone.go b/app/mix/service/logic/vas_zone.go index f4a8ab95..38bb18df 100644 --- a/app/mix/service/logic/vas_zone.go +++ b/app/mix/service/logic/vas_zone.go @@ -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) diff --git a/app/mix/service/xxljob_tasks.go b/app/mix/service/xxljob_tasks.go index 56b26e78..a082ca65 100644 --- a/app/mix/service/xxljob_tasks.go +++ b/app/mix/service/xxljob_tasks.go @@ -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 " +} diff --git a/dbstruct/vas_mongo.go b/dbstruct/vas_mongo.go index 4c221f04..1699013e 100644 --- a/dbstruct/vas_mongo.go +++ b/dbstruct/vas_mongo.go @@ -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"` }