- 线下提号创建表单扩展:增加「操作人」、「第三方单号」、「下单金额」、「押金金额」字段,重构弹窗布局为紧凑双列/三列金额卡片排布,消除过度垂直滚动并默认预填操作人 - 店铺管理 CRUD:新增 pickup_shops 配置表与配套 API,支持在提号页面直接管理店铺(增删改查、启用/禁用、筛选),下拉选项自动优先加载活跃配置店铺并兼顾历史店铺 - 列表时间范围筛选:增加精确到秒的「日期+时间」时间范围选择器,支持快捷时段与后端时间范围过滤 - 生产环境数据核查:只读提取线上全部 61 项历史提号店铺名称与单量分布,完整整理沉淀至实施文档供后续映射规则参考 - 验证方式:执行并通过全套端到端代码门禁(scripts/check.sh:SQL约束、go vet、go build、MySQL真实测试库单元测试及覆盖率、vue大小检查、prettier、eslint、vue-tsc及vite构建)
179 lines
5.5 KiB
Go
179 lines
5.5 KiB
Go
package pickup
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
"hfb_sys/backend/internal/auditlog"
|
|
)
|
|
|
|
type Service struct {
|
|
repo *Repository
|
|
}
|
|
|
|
func NewService(repo *Repository) *Service {
|
|
return &Service{repo: repo}
|
|
}
|
|
|
|
func (s *Service) Create(ctx context.Context, req CreateRequest, adminID uint64, meta auditlog.Meta) (*PickupDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
if req.ListingID == 0 {
|
|
return nil, ErrListingUnavailable
|
|
}
|
|
if req.ProfitAmountCent < 0 {
|
|
return nil, ErrInvalidProfit
|
|
}
|
|
return s.repo.Create(ctx, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) Complete(ctx context.Context, pickupID uint64, req CompleteRequest, adminID uint64, meta auditlog.Meta) (*PickupDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
if pickupID == 0 || req.SettleAmountCent <= 0 {
|
|
return nil, ErrInvalidAmount
|
|
}
|
|
if req.ProfitAmountCent != nil && *req.ProfitAmountCent < 0 {
|
|
return nil, ErrInvalidProfit
|
|
}
|
|
return s.repo.Complete(ctx, pickupID, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) MarkOfflineSettlement(ctx context.Context, pickupID uint64, req OfflineSettlementRequest, adminID uint64, meta auditlog.Meta) (*PickupDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
if pickupID == 0 {
|
|
return nil, ErrPickupNotFound
|
|
}
|
|
return s.repo.MarkOfflineSettlement(ctx, pickupID, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) UpdateProfit(ctx context.Context, pickupID uint64, req UpdateProfitRequest, adminID uint64, meta auditlog.Meta) (*PickupDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
if pickupID == 0 {
|
|
return nil, ErrPickupNotFound
|
|
}
|
|
if req.ProfitAmountCent < 0 {
|
|
return nil, ErrInvalidProfit
|
|
}
|
|
return s.repo.UpdateProfit(ctx, pickupID, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) CreateFinancialAdjustment(ctx context.Context, pickupID uint64, req FinancialAdjustmentRequest, adminID uint64, meta auditlog.Meta) (*PickupDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
if pickupID == 0 || (req.ProfitAmountCent == nil && req.SettleAmountCent == nil) || strings.TrimSpace(req.Reason) == "" {
|
|
return nil, ErrFinancialAdjustmentInvalid
|
|
}
|
|
if (req.ProfitAmountCent != nil && *req.ProfitAmountCent < 0) || (req.SettleAmountCent != nil && *req.SettleAmountCent < 0) {
|
|
return nil, ErrFinancialAdjustmentInvalid
|
|
}
|
|
return s.repo.CreateFinancialAdjustment(ctx, pickupID, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) ListFinancialAdjustments(ctx context.Context, pickupID uint64) ([]FinancialAdjustmentDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
if pickupID == 0 {
|
|
return nil, ErrPickupNotFound
|
|
}
|
|
return s.repo.ListFinancialAdjustments(ctx, pickupID)
|
|
}
|
|
|
|
func (s *Service) ProcessEvents(ctx context.Context, pickupID uint64) ([]ProcessEventDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.ProcessEvents(ctx, pickupID)
|
|
}
|
|
|
|
func (s *Service) SettleFinancialAdjustment(ctx context.Context, adjustmentID uint64, req FinancialAdjustmentSettlementRequest, adminID uint64, meta auditlog.Meta) error {
|
|
if s.repo == nil {
|
|
return ErrDependencyUnavailable
|
|
}
|
|
if adjustmentID == 0 {
|
|
return ErrFinancialAdjustmentNotFound
|
|
}
|
|
return s.repo.SettleFinancialAdjustment(ctx, adjustmentID, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) Cancel(ctx context.Context, pickupID uint64, reason string, adminID uint64, meta auditlog.Meta) error {
|
|
if s.repo == nil {
|
|
return ErrDependencyUnavailable
|
|
}
|
|
if pickupID == 0 || reason == "" {
|
|
return ErrPickupNotPickingUp
|
|
}
|
|
return s.repo.Cancel(ctx, pickupID, reason, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) FindByID(ctx context.Context, id uint64) (*PickupDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.FindByID(ctx, id)
|
|
}
|
|
|
|
func (s *Service) ListAdmin(ctx context.Context, query AdminPickupQuery) (*PaginatedResult, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.ListAdmin(ctx, query)
|
|
}
|
|
|
|
func (s *Service) ListShopNames(ctx context.Context, platform string) ([]string, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.ListShopNames(ctx, platform)
|
|
}
|
|
|
|
func (s *Service) ListForSeller(ctx context.Context, ownerID uint64, query SellerPickupQuery) (*PaginatedResult, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.ListForSeller(ctx, ownerID, query)
|
|
}
|
|
|
|
func (s *Service) ListAvailableListings(ctx context.Context, query AvailableListingQuery) (*AvailableListingsResult, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.ListAvailableListings(ctx, query)
|
|
}
|
|
|
|
func (s *Service) ListShops(ctx context.Context, query PickupShopQuery) ([]PickupShopDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.ListShops(ctx, query)
|
|
}
|
|
|
|
func (s *Service) CreateShop(ctx context.Context, req CreatePickupShopRequest, adminID uint64, meta auditlog.Meta) (*PickupShopDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.CreateShop(ctx, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) UpdateShop(ctx context.Context, id uint64, req UpdatePickupShopRequest, adminID uint64, meta auditlog.Meta) (*PickupShopDTO, error) {
|
|
if s.repo == nil {
|
|
return nil, ErrDependencyUnavailable
|
|
}
|
|
return s.repo.UpdateShop(ctx, id, req, adminID, meta)
|
|
}
|
|
|
|
func (s *Service) DeleteShop(ctx context.Context, id uint64, adminID uint64, meta auditlog.Meta) error {
|
|
if s.repo == nil {
|
|
return ErrDependencyUnavailable
|
|
}
|
|
return s.repo.DeleteShop(ctx, id, adminID, meta)
|
|
}
|