修复超时订单重置流程
This commit is contained in:
@@ -163,45 +163,64 @@ func (r *Repository) AdminMarkAbnormal(ctx context.Context, adminID uint64, orde
|
||||
})
|
||||
}
|
||||
|
||||
// AdminResetHandoff 将号主交接超时(owner_timeout)的订单重置回待号主交接,并刷新交接计时,
|
||||
// 让客服可以给号主再次提交交接说明的机会,避免订单卡死在超时状态。
|
||||
type adminResetTarget struct {
|
||||
OrderStatus string
|
||||
HandoffStatus string
|
||||
Label string
|
||||
OwnerTitle string
|
||||
OwnerContent string
|
||||
RenterTitle string
|
||||
RenterContent string
|
||||
AuditAction string
|
||||
RefreshStageTime bool
|
||||
}
|
||||
|
||||
// AdminResetHandoff 将超时卡住的订单恢复到对应待办阶段,并刷新阶段计时,
|
||||
// 让客服可以给责任方再次处理机会,避免订单卡死在异常状态。
|
||||
func (r *Repository) AdminResetHandoff(ctx context.Context, adminID uint64, orderID uint64, req AdminActionRequest, meta AuditMeta) error {
|
||||
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
var order model.RentalOrder
|
||||
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).First(&order, orderID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if order.Status != orderStatusPendingHandoff || order.HandoffStatus != handoffStatusOwnerTimeout {
|
||||
target, ok := resetTargetForOrder(order)
|
||||
if !ok {
|
||||
return ErrOrderCannotResetHandoff
|
||||
}
|
||||
beforeOrderStatus := order.Status
|
||||
beforeHandoffStatus := order.HandoffStatus
|
||||
now := time.Now()
|
||||
order.HandoffStatus = handoffStatusPendingOwner
|
||||
order.HandoffStartedAt = &now
|
||||
order.Status = target.OrderStatus
|
||||
order.HandoffStatus = target.HandoffStatus
|
||||
if target.RefreshStageTime {
|
||||
order.HandoffStartedAt = &now
|
||||
}
|
||||
if err := notification.Append(tx,
|
||||
notification.Entry{
|
||||
UserID: order.OwnerID,
|
||||
Type: "order_admin",
|
||||
Title: "请重新提交交接说明",
|
||||
Content: "客服已重置交接状态,请尽快提交交接说明,避免再次超时。原因:" + req.Reason,
|
||||
Title: target.OwnerTitle,
|
||||
Content: target.OwnerContent + "原因:" + req.Reason,
|
||||
BizType: "order",
|
||||
BizID: &order.ID,
|
||||
},
|
||||
notification.Entry{
|
||||
UserID: order.RenterID,
|
||||
Type: "order_admin",
|
||||
Title: "订单交接已重置",
|
||||
Content: "客服已重置交接状态,正在等待号主重新提交交接说明。原因:" + req.Reason,
|
||||
Title: target.RenterTitle,
|
||||
Content: target.RenterContent + "原因:" + req.Reason,
|
||||
BizType: "order",
|
||||
BizID: &order.ID,
|
||||
},
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := appendAuditLog(tx, adminID, "order.reset_handoff", "order", order.ID, meta, map[string]any{
|
||||
if err := appendAuditLog(tx, adminID, target.AuditAction, "order", order.ID, meta, map[string]any{
|
||||
"order_id": order.ID,
|
||||
"order_no": order.OrderNo,
|
||||
"reason": req.Reason,
|
||||
"before_order_status": beforeOrderStatus,
|
||||
"after_order_status": order.Status,
|
||||
"before_handoff_status": beforeHandoffStatus,
|
||||
"after_handoff_status": order.HandoffStatus,
|
||||
}); err != nil {
|
||||
@@ -211,6 +230,51 @@ func (r *Repository) AdminResetHandoff(ctx context.Context, adminID uint64, orde
|
||||
})
|
||||
}
|
||||
|
||||
func resetTargetForOrder(order model.RentalOrder) (adminResetTarget, bool) {
|
||||
if order.Status == orderStatusPendingHandoff && order.HandoffStatus == handoffStatusOwnerTimeout {
|
||||
return adminResetTarget{
|
||||
OrderStatus: orderStatusPendingHandoff,
|
||||
HandoffStatus: handoffStatusPendingOwner,
|
||||
Label: "重置交接",
|
||||
OwnerTitle: "请重新提交交接说明",
|
||||
OwnerContent: "客服已重置交接状态,请尽快提交交接说明,避免再次超时。",
|
||||
RenterTitle: "订单交接已重置",
|
||||
RenterContent: "客服已重置交接状态,正在等待号主重新提交交接说明。",
|
||||
AuditAction: "order.reset_handoff",
|
||||
RefreshStageTime: true,
|
||||
}, true
|
||||
}
|
||||
if order.Status == orderStatusAbnormal && order.HandoffStatus == handoffStatusRenterConfirmTimeout {
|
||||
return adminResetTarget{
|
||||
OrderStatus: orderStatusPendingHandoff,
|
||||
HandoffStatus: handoffStatusPendingRenterConfirm,
|
||||
Label: "重置确认收号",
|
||||
OwnerTitle: "订单确认收号已重置",
|
||||
OwnerContent: "客服已重置确认收号状态,正在等待租客重新确认收号。",
|
||||
RenterTitle: "请重新确认收号",
|
||||
RenterContent: "客服已重置确认收号状态,请尽快检查账号并确认收号,避免再次超时。",
|
||||
AuditAction: "order.reset_renter_confirm",
|
||||
RefreshStageTime: true,
|
||||
}, true
|
||||
}
|
||||
if order.Status == orderStatusAbnormal &&
|
||||
(order.HandoffStatus == handoffStatusOwnerCheckoutConfirmTimeout ||
|
||||
order.HandoffStatus == handoffStatusOwnerReturnConfirmTimeout) {
|
||||
return adminResetTarget{
|
||||
OrderStatus: orderStatusPendingCheckoutConfirm,
|
||||
HandoffStatus: handoffStatusPendingOwnerCheckout,
|
||||
Label: "重置结账确认",
|
||||
OwnerTitle: "请重新确认结账",
|
||||
OwnerContent: "客服已重置结账确认状态,请尽快核对账号和结账金额,避免再次超时。",
|
||||
RenterTitle: "结账确认已重置",
|
||||
RenterContent: "客服已重置结账确认状态,正在等待号主重新确认结账。",
|
||||
AuditAction: "order.reset_checkout_confirm",
|
||||
RefreshStageTime: true,
|
||||
}, true
|
||||
}
|
||||
return adminResetTarget{}, false
|
||||
}
|
||||
|
||||
// AdminRefund 触发后台人工退款,退款由 payment 模块走渠道原路退回。
|
||||
func (r *Repository) AdminRefund(ctx context.Context, orderID uint64) (*RefundStatusDTO, error) {
|
||||
var order model.RentalOrder
|
||||
|
||||
Reference in New Issue
Block a user