feat: 客服封存订单功能(号主失联场景)

新增客服「封存订单」动作,用于号主失联、无法联系的场景:单事务内
完成关闭订单、全量原路退款、永久封存关联商品、解散发布群、双方通知
与审计日志。

- 新增 listing 终态 sealed(封存),区别于可恢复的 offline
- listingLockedForOwnerMutation 锁定 sealed,号主无法再编辑/提审/上架
- 解散群聊按 listing_id 查发布群(listing_group)置 archived,
  阻断所有成员发言并留系统消息
- 新增 order.AdminSeal 及 /admin/orders/:id/seal 路由
- 前端:卖家页 PC/移动端 sealed 视为终态禁用操作,客服后台新增
  「封存订单」按钮与二次确认

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
yml2213
2026-06-29 22:52:20 +08:00
co-authored by Claude Opus 4.8
parent 8a11c2517e
commit be5d322c10
16 changed files with 217 additions and 4 deletions
@@ -21,8 +21,15 @@ type OrderChatNotifier interface {
NotifyNewConversation(conversationID uint64)
}
// OrderChatArchiver 由 chat 模块适配实现,在订单封存时于同一事务内解散关联群聊。
// 实际聊天群按 listing 关联(发布群 listing_group),故传 listingID。
type OrderChatArchiver interface {
ArchiveListingConversation(tx *gorm.DB, listingID uint64, reason string) error
}
type Dependencies struct {
ChatNotifier OrderChatNotifier
ChatArchiver OrderChatArchiver
RefundStarter RefundStarter
}
@@ -36,6 +43,7 @@ type refundAction struct {
type Repository struct {
db *gorm.DB
chatNotifier OrderChatNotifier
chatArchiver OrderChatArchiver
refundStarter RefundStarter
}
@@ -45,6 +53,7 @@ func NewRepository(db *gorm.DB, deps ...Dependencies) *Repository {
repo := &Repository{db: db}
if len(deps) > 0 {
repo.chatNotifier = deps[0].ChatNotifier
repo.chatArchiver = deps[0].ChatArchiver
repo.refundStarter = deps[0].RefundStarter
}
return repo