- 后端支持补录/修改第三方单号接口 PUT /api/v1/admin/pickups/:id/third-party-order-no,记录流转事件与审计日志 - 前端线下提号主列表在第三方单号列后展示提号备注列 - 前端列表操作列及提号详情页增加补录/修改第三方单号操作入口与弹窗 - 通过 scripts/check.sh 全量门禁校验
288 lines
12 KiB
Go
288 lines
12 KiB
Go
package pickup
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"gorm.io/datatypes"
|
|
)
|
|
|
|
// 提号状态
|
|
const (
|
|
StatusPickingUp = "picking_up"
|
|
StatusCompleted = "completed"
|
|
StatusCancelled = "cancelled"
|
|
|
|
AccountSourceInternal = "internal"
|
|
AccountSourceExternalPlatformManaged = "external_platform_managed"
|
|
ListingSourceExternal = "external"
|
|
ListingSourceInternal = "internal"
|
|
SettlementModeOwnerWallet = "owner_wallet"
|
|
SettlementModePlatformManaged = "platform_managed"
|
|
OfflineSettlementStatusNone = "none"
|
|
OfflineSettlementStatusPending = "pending"
|
|
OfflineSettlementStatusSettled = "settled"
|
|
FinancialAdjustmentStatusSettled = "settled"
|
|
FinancialAdjustmentStatusPending = "pending"
|
|
FinancialAdjustmentStatusRecovery = "recovery_pending"
|
|
|
|
PickupShopStatusActive = "active"
|
|
PickupShopStatusDisabled = "disabled"
|
|
)
|
|
|
|
var (
|
|
ErrDependencyUnavailable = errors.New("dependency unavailable")
|
|
ErrListingUnavailable = errors.New("listing unavailable")
|
|
ErrPickupNotFound = errors.New("pickup not found")
|
|
ErrPickupNotPickingUp = errors.New("pickup not in picking_up status")
|
|
ErrInvalidAmount = errors.New("invalid amount")
|
|
ErrInvalidProfit = errors.New("invalid profit amount")
|
|
ErrDuplicatePickup = errors.New("duplicate pickup in progress")
|
|
ErrOfflineSettlementCannotMark = errors.New("pickup offline settlement cannot be marked")
|
|
ErrFinancialAdjustmentInvalid = errors.New("financial adjustment invalid")
|
|
ErrFinancialAdjustmentNotFound = errors.New("financial adjustment not found")
|
|
ErrFinancialAdjustmentCannotSettle = errors.New("financial adjustment cannot be settled")
|
|
ErrPickupShopNotFound = errors.New("pickup shop not found")
|
|
ErrPickupShopNameExists = errors.New("pickup shop name already exists")
|
|
ErrPickupCancelled = errors.New("pickup is cancelled")
|
|
ErrInvalidThirdPartyOrderNo = errors.New("invalid third party order no")
|
|
)
|
|
|
|
type PickupDTO struct {
|
|
ID uint64 `json:"id"`
|
|
PickupNo string `json:"pickup_no"`
|
|
ListingID uint64 `json:"listing_id"`
|
|
ListingNo string `json:"listing_no"`
|
|
AccountID uint64 `json:"account_id"`
|
|
AccountTitle string `json:"account_title"`
|
|
ServerRegion string `json:"server_region"`
|
|
LoginPlatform string `json:"login_platform"`
|
|
OwnerID uint64 `json:"owner_id"`
|
|
OwnerPhone string `json:"owner_phone"`
|
|
AdminID uint64 `json:"admin_id"`
|
|
Operator string `json:"operator"`
|
|
Platform string `json:"platform"`
|
|
ThirdPartyOrderNo string `json:"third_party_order_no"`
|
|
ShopName string `json:"shop_name"`
|
|
RawShopName string `json:"raw_shop_name"`
|
|
AccountSource string `json:"account_source"`
|
|
SourceChannel string `json:"source_channel"`
|
|
SettlementMode string `json:"settlement_mode"`
|
|
ListingPriceCent int64 `json:"listing_price_cent"`
|
|
OrderAmountCent int64 `json:"order_amount_cent"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent"`
|
|
OwnerPriceCent int64 `json:"owner_price_cent"`
|
|
WebsiteProfitCent int64 `json:"website_profit_cent"`
|
|
ProfitAmountCent int64 `json:"profit_amount_cent"`
|
|
ProfitAdjustmentCent int64 `json:"profit_adjustment_cent"`
|
|
EffectiveProfitAmountCent int64 `json:"effective_profit_amount_cent"`
|
|
SellerRatio float64 `json:"seller_ratio"`
|
|
BuyerRatio float64 `json:"buyer_ratio"`
|
|
AccountSnapshot datatypes.JSON `json:"account_snapshot,omitempty"`
|
|
SettleAmountCent int64 `json:"settle_amount_cent"`
|
|
SettleAdjustmentCent int64 `json:"settle_adjustment_cent"`
|
|
EffectiveSettleAmountCent int64 `json:"effective_settle_amount_cent"`
|
|
Status string `json:"status"`
|
|
OfflineSettlementStatus string `json:"offline_settlement_status"`
|
|
OfflineSettlementRemark string `json:"offline_settlement_remark"`
|
|
OfflineSettledBy *uint64 `json:"offline_settled_by,omitempty"`
|
|
OfflineSettledAt *time.Time `json:"offline_settled_at,omitempty"`
|
|
Remark string `json:"remark"`
|
|
CompleteRemark string `json:"complete_remark"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
|
CancelledAt *time.Time `json:"cancelled_at,omitempty"`
|
|
}
|
|
|
|
type FinancialAdjustmentDTO struct {
|
|
ID uint64 `json:"id"`
|
|
PickupID uint64 `json:"pickup_id"`
|
|
ProfitDeltaCent int64 `json:"profit_delta_cent"`
|
|
SettleDeltaCent int64 `json:"settle_delta_cent"`
|
|
SettlementMode string `json:"settlement_mode"`
|
|
Status string `json:"status"`
|
|
Reason string `json:"reason"`
|
|
CreatedBy uint64 `json:"created_by"`
|
|
SettledBy *uint64 `json:"settled_by,omitempty"`
|
|
SettledAt *time.Time `json:"settled_at,omitempty"`
|
|
SettlementRemark string `json:"settlement_remark"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type CreateRequest struct {
|
|
ListingID uint64 `json:"listing_id" binding:"required"`
|
|
Operator string `json:"operator" binding:"max=64"`
|
|
Platform string `json:"platform"`
|
|
ThirdPartyOrderNo string `json:"third_party_order_no" binding:"max=128"`
|
|
ShopName string `json:"shop_name" binding:"max=100"`
|
|
OrderAmountCent int64 `json:"order_amount_cent" binding:"min=0"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent" binding:"min=0"`
|
|
ProfitAmountCent int64 `json:"profit_amount_cent"`
|
|
Remark string `json:"remark"`
|
|
}
|
|
|
|
type CompleteRequest struct {
|
|
SettleAmountCent int64 `json:"settle_amount_cent" binding:"required,min=1"`
|
|
ProfitAmountCent *int64 `json:"profit_amount_cent"`
|
|
CompleteRemark string `json:"complete_remark"`
|
|
}
|
|
|
|
type OfflineSettlementRequest struct {
|
|
Remark string `json:"remark" binding:"max=255"`
|
|
}
|
|
|
|
type UpdateProfitRequest struct {
|
|
ProfitAmountCent int64 `json:"profit_amount_cent" binding:"min=0"`
|
|
Reason string `json:"reason"`
|
|
}
|
|
|
|
type UpdateThirdPartyOrderNoRequest struct {
|
|
ThirdPartyOrderNo string `json:"third_party_order_no" binding:"required,max=128"`
|
|
}
|
|
|
|
// FinancialAdjustmentRequest 按目标金额创建完成后的差额流水,至少提供一个金额。
|
|
type FinancialAdjustmentRequest struct {
|
|
ProfitAmountCent *int64 `json:"profit_amount_cent"`
|
|
SettleAmountCent *int64 `json:"settle_amount_cent"`
|
|
Reason string `json:"reason" binding:"required,max=255"`
|
|
}
|
|
|
|
type FinancialAdjustmentSettlementRequest struct {
|
|
Remark string `json:"remark" binding:"max=255"`
|
|
}
|
|
|
|
type CancelRequest struct {
|
|
Reason string `json:"reason" binding:"required"`
|
|
}
|
|
|
|
type AdminPickupQuery struct {
|
|
Page int
|
|
PageSize int
|
|
Keyword string
|
|
Status string
|
|
ShopName string
|
|
AccountSource string
|
|
OfflineSettlementStatus string
|
|
Operator string
|
|
ThirdPartyOrderNo string
|
|
StartTime *time.Time
|
|
EndTime *time.Time
|
|
}
|
|
|
|
type PickupShopDTO struct {
|
|
ID uint64 `json:"id"`
|
|
Name string `json:"name"`
|
|
Platform string `json:"platform"`
|
|
Status string `json:"status"`
|
|
SortOrder int `json:"sort_order"`
|
|
Remark string `json:"remark"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type CreatePickupShopRequest struct {
|
|
Name string `json:"name" binding:"required,max=100"`
|
|
Platform string `json:"platform" binding:"max=32"`
|
|
Status string `json:"status" binding:"omitempty,oneof=active disabled"`
|
|
SortOrder int `json:"sort_order"`
|
|
Remark string `json:"remark" binding:"max=255"`
|
|
}
|
|
|
|
type UpdatePickupShopRequest struct {
|
|
Name string `json:"name" binding:"required,max=100"`
|
|
Platform string `json:"platform" binding:"max=32"`
|
|
Status string `json:"status" binding:"required,oneof=active disabled"`
|
|
SortOrder int `json:"sort_order"`
|
|
Remark string `json:"remark" binding:"max=255"`
|
|
}
|
|
|
|
type PickupShopQuery struct {
|
|
Keyword string
|
|
Platform string
|
|
Status string
|
|
}
|
|
|
|
type PickupShopHistoricalItemDTO struct {
|
|
SourceName string `json:"source_name"`
|
|
Count int64 `json:"count"`
|
|
MappingStatus string `json:"mapping_status"` // standard, mapped, unmapped
|
|
TargetShopID uint64 `json:"target_shop_id,omitempty"`
|
|
TargetShopName string `json:"target_shop_name,omitempty"`
|
|
Remark string `json:"remark,omitempty"`
|
|
}
|
|
|
|
type PickupShopHistoricalStatsDTO struct {
|
|
Items []PickupShopHistoricalItemDTO `json:"items"`
|
|
TotalPickups int64 `json:"total_pickups"`
|
|
TotalShops int `json:"total_shops"`
|
|
StandardCount int `json:"standard_count"`
|
|
MappedCount int `json:"mapped_count"`
|
|
UnmappedCount int `json:"unmapped_count"`
|
|
}
|
|
|
|
type MapHistoricalShopsRequest struct {
|
|
FromShopNames []string `json:"from_shop_names" binding:"required,min=1"`
|
|
TargetShopName string `json:"target_shop_name" binding:"required,max=100"`
|
|
CreateTargetMissing bool `json:"create_target_missing"`
|
|
TargetPlatform string `json:"target_platform" binding:"max=32"`
|
|
Remark string `json:"remark" binding:"max=255"`
|
|
}
|
|
|
|
type MapHistoricalShopsResultDTO struct {
|
|
UpdatedPickupsCount int64 `json:"updated_pickups_count"`
|
|
TargetShopName string `json:"target_shop_name"`
|
|
TargetShopID uint64 `json:"target_shop_id"`
|
|
CreatedStandardShop bool `json:"created_standard_shop"`
|
|
}
|
|
|
|
type SellerPickupQuery struct {
|
|
Page int
|
|
PageSize int
|
|
Status string
|
|
}
|
|
|
|
type AvailableListingDTO struct {
|
|
ID uint64 `json:"id"`
|
|
ListingNo string `json:"listing_no"`
|
|
AccountID uint64 `json:"account_id"`
|
|
AccountTitle string `json:"account_title"`
|
|
ServerRegion string `json:"server_region"`
|
|
LoginPlatform string `json:"login_platform"`
|
|
OwnerID uint64 `json:"owner_id"`
|
|
OwnerPhone string `json:"owner_phone"`
|
|
ListingPriceCent int64 `json:"listing_price_cent"`
|
|
OwnerPriceCent int64 `json:"owner_price_cent"`
|
|
OwnerPurePriceCent int64 `json:"owner_pure_price_cent"`
|
|
OwnerExtraItemPriceCent int64 `json:"owner_extra_item_price_cent"`
|
|
OwnerTotalPriceCent int64 `json:"owner_total_price_cent"`
|
|
WebsiteProfitCent int64 `json:"website_profit_cent"`
|
|
SellerRatio float64 `json:"seller_ratio"`
|
|
BuyerRatio float64 `json:"buyer_ratio"`
|
|
AccountSource string `json:"account_source"`
|
|
IsExternalUpload bool `json:"is_external_upload"`
|
|
SourceChannel string `json:"source_channel"`
|
|
HandoffMode string `json:"handoff_mode"`
|
|
SettlementMode string `json:"settlement_mode"`
|
|
}
|
|
|
|
type AvailableListingQuery struct {
|
|
Page int
|
|
PageSize int
|
|
Keyword string
|
|
SourceType string
|
|
}
|
|
|
|
type PaginatedResult struct {
|
|
Items []PickupDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type AvailableListingsResult struct {
|
|
Items []AvailableListingDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|