支持客服主动发起申诉

This commit is contained in:
yml2213
2026-07-26 09:54:27 +08:00
parent 4bc25b87d8
commit 9ccc16e068
20 changed files with 522 additions and 25 deletions
@@ -169,6 +169,58 @@ func TestRepositoryCancelRestoresCheckoutDisputeStatus(t *testing.T) {
}
}
func TestAdminCreateByOrderCreatesAdminInitiatedDispute(t *testing.T) {
db := setupDisputeTestDB(t)
repo := NewRepository(db)
adminID := uint64(88)
owner, renter, order := createDisputeOrderFixture(t, db, model.RentalOrder{
Status: "renting",
HandoffStatus: "received",
SettlementStatus: "unsettled",
})
created, err := repo.AdminCreateByOrder(t.Context(), adminID, order.ID, AdminCreateRequest{
Type: "cannot_login",
TargetRole: "owner",
Description: "客服核查后主动发起申诉",
}, AuditMeta{})
if err != nil {
t.Fatalf("后台发起申诉失败: %v", err)
}
if created.InitiatorType != disputeInitiatorAdmin || created.InitiatorAdminID == nil || *created.InitiatorAdminID != adminID {
t.Fatalf("发起方 = %s/%v, want admin/%d", created.InitiatorType, created.InitiatorAdminID, adminID)
}
if created.InitiatorID != 0 || created.TargetUserID != owner.ID {
t.Fatalf("initiator/target = %d/%d, want 0/%d", created.InitiatorID, created.TargetUserID, owner.ID)
}
var saved model.RentalOrder
if err := db.First(&saved, order.ID).Error; err != nil {
t.Fatalf("读取订单失败: %v", err)
}
if saved.Status != "disputing" || saved.HandoffStatus != "received" || saved.SettlementStatus != "unsettled" {
t.Fatalf("订单状态 = %s/%s/%s, want disputing/received/unsettled", saved.Status, saved.HandoffStatus, saved.SettlementStatus)
}
if _, err := repo.FindForUser(t.Context(), renter.ID, created.ID); err != nil {
t.Fatalf("租客应能看到客服发起的申诉: %v", err)
}
if _, err := repo.FindForUser(t.Context(), owner.ID, created.ID); err != nil {
t.Fatalf("号主应能看到客服发起的申诉: %v", err)
}
if _, err := repo.CancelByOrder(t.Context(), renter.ID, order.ID); err == nil {
t.Fatal("客服发起的申诉不应允许租客取消")
}
var record model.HandoffRecord
if err := db.Where("order_id = ? AND type = ?", order.ID, "admin_dispute_opened").First(&record).Error; err != nil {
t.Fatalf("读取客服发起申诉记录失败: %v", err)
}
if record.FromUserID != adminID || record.ToUserID != owner.ID {
t.Fatalf("record from/to = %d/%d, want %d/%d", record.FromUserID, record.ToUserID, adminID, owner.ID)
}
}
func TestPlatformManagedArbitrationUsesOfflineSettlement(t *testing.T) {
db := setupDisputeTestDB(t)
repo := NewRepository(db)