分销后台前端对接与结算明细接口

- 新增 GET /admin/distribution/settlement-batches/:id/items 明细查询
- distribution-admin 重构为 react-router 多页面:仪表盘/网站/规则(启停)/订单(筛选分页)/结算(创建/明细/结算)/支付通道(绑定解绑)/账号展示(上下架)
- axios 统一 401 提示,引导回主站后台登录;金额统一整数分格式化
- npm run build(tsc 严格模式) 通过
This commit is contained in:
yml2213
2026-09-05 11:17:43 +08:00
parent ac777f5b16
commit 3162d15425
15 changed files with 1006 additions and 38 deletions
@@ -178,3 +178,11 @@ type CreateFinancialSnapshotRequest struct {
MarkupAmountCent int64 `json:"markup_amount_cent"`
Parties []SnapshotPartyRequest `json:"parties"`
}
type SettlementItemDTO struct {
ID uint64 `json:"id"`
OrderID uint64 `json:"order_id"`
PartyRole string `json:"party_role"`
AmountCent int64 `json:"amount_cent"`
Status string `json:"status"`
}
@@ -322,6 +322,20 @@ func (h *Handler) CreateSettlementBatch(c *gin.Context) {
response.Created(c, item)
}
func (h *Handler) ListSettlementItems(c *gin.Context) {
id, ok := parseID(c)
if !ok {
return
}
adminID, _ := currentAdminID(c)
items, err := h.service.ListSettlementItems(c.Request.Context(), adminID, id)
if err != nil {
writeError(c, err)
return
}
response.OK(c, gin.H{"items": items})
}
func (h *Handler) MarkSettlementBatch(c *gin.Context) {
id, ok := parseID(c)
if !ok {
@@ -582,3 +582,33 @@ func (r *Repository) CreateFinancialSnapshot(ctx context.Context, adminID, order
}
return r.FindOrder(ctx, adminID, orderID)
}
func (r *Repository) ListSettlementItems(ctx context.Context, adminID, batchID uint64) ([]SettlementItemDTO, error) {
var batch model.DistributionSettlementBatch
if err := r.db.WithContext(ctx).First(&batch, batchID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrSettlementBatchNotFound
}
return nil, err
}
if err := r.ensureSiteAccess(ctx, adminID, batch.SiteID); err != nil {
return nil, err
}
var rows []struct {
model.DistributionSettlementItem
PartyRole string
}
if err := r.db.WithContext(ctx).
Table("distribution_settlement_items i").
Select("i.id, i.order_id, i.amount_cent, i.status, p.party_role").
Joins("JOIN distribution_order_parties p ON p.id = i.party_id").
Where("i.batch_id = ?", batchID).
Order("i.id ASC").Scan(&rows).Error; err != nil {
return nil, err
}
items := make([]SettlementItemDTO, 0, len(rows))
for _, row := range rows {
items = append(items, SettlementItemDTO{ID: row.ID, OrderID: row.OrderID, PartyRole: row.PartyRole, AmountCent: row.AmountCent, Status: row.Status})
}
return items, nil
}
@@ -152,6 +152,12 @@ func (s *Service) CreateSettlementBatch(ctx context.Context, adminID uint64, req
}
return s.repo.CreateSettlementBatch(ctx, adminID, req)
}
func (s *Service) ListSettlementItems(ctx context.Context, adminID, batchID uint64) ([]SettlementItemDTO, error) {
if err := s.available(); err != nil {
return nil, err
}
return s.repo.ListSettlementItems(ctx, adminID, batchID)
}
func (s *Service) MarkSettlementBatch(ctx context.Context, adminID, id uint64) (*SettlementBatchDTO, error) {
if err := s.available(); err != nil {
return nil, err