package bootstrap import ( "context" "go.uber.org/zap" agentrechargeApp "github.com/break/junhong_cmp_fiber/internal/application/agentrecharge" approvalApp "github.com/break/junhong_cmp_fiber/internal/application/approval" cardObservationApp "github.com/break/junhong_cmp_fiber/internal/application/cardobservation" exchangeApp "github.com/break/junhong_cmp_fiber/internal/application/exchange" refundapprovalApp "github.com/break/junhong_cmp_fiber/internal/application/refundapproval" walletapp "github.com/break/junhong_cmp_fiber/internal/application/wallet" approvalInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/approval" cardObservationInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/cardobservation" exchangeInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/exchange" "github.com/break/junhong_cmp_fiber/internal/infrastructure/integrationlog" "github.com/break/junhong_cmp_fiber/internal/infrastructure/messaging/outbox" walletinfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/wallet" wecomInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/wecom" "github.com/break/junhong_cmp_fiber/internal/polling" accountSvc "github.com/break/junhong_cmp_fiber/internal/service/account" accountAuditSvc "github.com/break/junhong_cmp_fiber/internal/service/account_audit" agentOpenAPISvc "github.com/break/junhong_cmp_fiber/internal/service/agent_open_api" assetAllocationRecordSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_allocation_record" assetAuditSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_audit" authSvc "github.com/break/junhong_cmp_fiber/internal/service/auth" carrierSvc "github.com/break/junhong_cmp_fiber/internal/service/carrier" clientAuthSvc "github.com/break/junhong_cmp_fiber/internal/service/client_auth" commissionCalculationSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_calculation" commissionStatsSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_stats" commissionWithdrawalSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_withdrawal" commissionWithdrawalSettingSvc "github.com/break/junhong_cmp_fiber/internal/service/commission_withdrawal_setting" customerBindingSvc "github.com/break/junhong_cmp_fiber/internal/service/customer_binding" "github.com/break/junhong_cmp_fiber/internal/store/postgres" "github.com/break/junhong_cmp_fiber/pkg/config" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/payment" "github.com/break/junhong_cmp_fiber/pkg/queue" assetSvc "github.com/break/junhong_cmp_fiber/internal/service/asset" assetPackageBatchOrderSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_package_batch_order" assetWalletSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_wallet" deviceSvc "github.com/break/junhong_cmp_fiber/internal/service/device" deviceImportSvc "github.com/break/junhong_cmp_fiber/internal/service/device_import" enterpriseSvc "github.com/break/junhong_cmp_fiber/internal/service/enterprise" enterpriseCardSvc "github.com/break/junhong_cmp_fiber/internal/service/enterprise_card" enterpriseDeviceSvc "github.com/break/junhong_cmp_fiber/internal/service/enterprise_device" exchangeSvc "github.com/break/junhong_cmp_fiber/internal/service/exchange" exportTaskSvc "github.com/break/junhong_cmp_fiber/internal/service/export_task" iotCardSvc "github.com/break/junhong_cmp_fiber/internal/service/iot_card" iotCardImportSvc "github.com/break/junhong_cmp_fiber/internal/service/iot_card_import" orderSvc "github.com/break/junhong_cmp_fiber/internal/service/order" packageSvc "github.com/break/junhong_cmp_fiber/internal/service/package" packageSeriesSvc "github.com/break/junhong_cmp_fiber/internal/service/package_series" permissionSvc "github.com/break/junhong_cmp_fiber/internal/service/permission" personalCustomerSvc "github.com/break/junhong_cmp_fiber/internal/service/personal_customer" purchaseValidationSvc "github.com/break/junhong_cmp_fiber/internal/service/purchase_validation" rechargeSvc "github.com/break/junhong_cmp_fiber/internal/service/recharge" roleSvc "github.com/break/junhong_cmp_fiber/internal/service/role" shopSvc "github.com/break/junhong_cmp_fiber/internal/service/shop" agentRechargeSvc "github.com/break/junhong_cmp_fiber/internal/service/agent_recharge" operationPasswordSvc "github.com/break/junhong_cmp_fiber/internal/service/operation_password" orderPackageInvalidateSvc "github.com/break/junhong_cmp_fiber/internal/service/order_package_invalidate" pollingSvc "github.com/break/junhong_cmp_fiber/internal/service/polling" refundSvc "github.com/break/junhong_cmp_fiber/internal/service/refund" shopCommissionSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_commission" shopPackageBatchAllocationSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_package_batch_allocation" shopPackageBatchPricingSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_package_batch_pricing" shopSeriesGrantSvc "github.com/break/junhong_cmp_fiber/internal/service/shop_series_grant" trafficSvc "github.com/break/junhong_cmp_fiber/internal/service/traffic" wechatConfigSvc "github.com/break/junhong_cmp_fiber/internal/service/wechat_config" ) type services struct { Approval *approvalApp.CreationService Account *accountSvc.Service AccountAudit *accountAuditSvc.Service AssetAudit *assetAuditSvc.Service Role *roleSvc.Service Permission *permissionSvc.Service PersonalCustomer *personalCustomerSvc.Service ClientAuth *clientAuthSvc.Service Shop *shopSvc.Service Auth *authSvc.Service ShopCommission *shopCommissionSvc.Service CommissionWithdrawal *commissionWithdrawalSvc.Service CommissionWithdrawalSetting *commissionWithdrawalSettingSvc.Service CommissionCalculation *commissionCalculationSvc.Service Enterprise *enterpriseSvc.Service EnterpriseCard *enterpriseCardSvc.Service EnterpriseDevice *enterpriseDeviceSvc.Service Authorization *enterpriseCardSvc.AuthorizationService IotCard *iotCardSvc.Service IotCardImport *iotCardImportSvc.Service ExportTask *exportTaskSvc.Service Device *deviceSvc.Service DeviceImport *deviceImportSvc.Service AssetAllocationRecord *assetAllocationRecordSvc.Service Carrier *carrierSvc.Service PackageSeries *packageSeriesSvc.Service Package *packageSvc.Service PackageDailyRecord *packageSvc.DailyRecordService PackageCustomerView *packageSvc.CustomerViewService ShopPackageBatchAllocation *shopPackageBatchAllocationSvc.Service ShopPackageBatchPricing *shopPackageBatchPricingSvc.Service ShopSeriesGrant *shopSeriesGrantSvc.Service CommissionStats *commissionStatsSvc.Service PurchaseValidation *purchaseValidationSvc.Service Order *orderSvc.Service Exchange *exchangeSvc.Service Recharge *rechargeSvc.Service PollingConfig *pollingSvc.ConfigService PollingConcurrency *pollingSvc.ConcurrencyService PollingMonitoring *pollingSvc.MonitoringService PollingAlert *pollingSvc.AlertService PollingCleanup *pollingSvc.CleanupService PollingManualTrigger *pollingSvc.ManualTriggerService Asset *assetSvc.Service AssetLifecycle *assetSvc.LifecycleService AssetWallet *assetWalletSvc.Service StopResumeService *iotCardSvc.StopResumeService WechatConfig *wechatConfigSvc.Service AgentRecharge *agentRechargeSvc.Service PackageActivation *packageSvc.ActivationService Refund *refundSvc.Service TrafficQuery *trafficSvc.QueryService OperationPassword *operationPasswordSvc.Service AgentOpenAPI *agentOpenAPISvc.Service CustomerBinding *customerBindingSvc.Service OrderPackageInvalidate *orderPackageInvalidateSvc.Service AssetPackageBatchOrder *assetPackageBatchOrderSvc.Service ObservationSeries cardObservationApp.BestEffortSeriesDispatcher CardObservation *cardObservationApp.Service CardObservationSeries *cardObservationApp.SeriesAttemptService } func initServices(s *stores, deps *Dependencies) *services { // CustomerBinding 模块依赖最少,最先初始化 customerBinding := customerBindingSvc.New(deps.DB, s.IotCard, s.Device) purchaseValidation := purchaseValidationSvc.New(deps.DB, s.IotCard, s.Device, s.Package, s.ShopPackageAllocation) accountAudit := accountAuditSvc.NewService(s.AccountOperationLog) assetAudit := assetAuditSvc.NewService(s.AssetOperationLog, deps.DB) account := accountSvc.New(s.Account, s.Role, s.AccountRole, s.ShopRole, s.Shop, s.Enterprise, accountAudit) // 创建 IotCard service 并设置回调 iotCard := iotCardSvc.New( deps.DB, s.IotCard, s.Shop, s.AssetAllocationRecord, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.PackageSeries, deps.GatewayClient, deps.Logger, assetAudit, ) cardObservationOutbox := outbox.NewRepository() observationSeriesEvents := cardObservationInfra.NewSeriesEventWriter(cardObservationOutbox) cardObservationService := cardObservationApp.NewService( deps.DB, cardObservationInfra.NewEventWriter(cardObservationOutbox), cardObservationInfra.NewCacheInvalidator(deps.Redis, deps.Logger), ) iotCard.SetCardObservationService(cardObservationService) iotCard.SetSpeedTierIntegrationLog(integrationlog.NewRepository(deps.DB)) seriesCoordinator := cardObservationInfra.NewSeriesCoordinator(deps.Redis) seriesIntegration := integrationlog.NewRepository(deps.DB) seriesTrigger := cardObservationApp.NewSeriesTrigger( seriesCoordinator, queue.NewCardObservationSeriesScheduler(deps.QueueClient), cardObservationInfra.NewSeriesAttemptLogger(seriesIntegration), ) cardObservationSeries := cardObservationApp.NewSeriesAttemptService( seriesCoordinator, cardObservationInfra.NewSeriesRunner(deps.DB, deps.GatewayClient, cardObservationService, seriesIntegration), cardObservationInfra.NewSeriesAttemptLogger(seriesIntegration), ) observationSeries := cardObservationInfra.NewBestEffortSeriesDispatcher(seriesTrigger, deps.Logger, s.DeviceSimBinding, s.Carrier) iotCard.SetObservationSeriesDispatcher(observationSeries) // 使用 PollingLifecycleService 替代 APICallback:通过分片队列准确操作(修复 api_callback.go 遗漏 protect 队列的 Bug3) pollingConfigStore := postgres.NewPollingConfigStore(deps.DB) pollingConfigMgr := polling.NewPollingConfigManager(pollingConfigStore, deps.Redis, deps.Logger) if err := pollingConfigMgr.Load(context.Background()); err != nil { deps.Logger.Warn("API 进程加载轮询配置失败", zap.Error(err)) } pollingConfigMgr.Start(context.Background()) pollingQueueMgr := polling.NewPollingQueueManager(deps.Redis, constants.PollingShardCount, deps.Logger) pollingLifecycleSvc := polling.NewPollingLifecycleService(pollingQueueMgr, pollingConfigMgr, s.IotCard, s.DeviceSimBinding, s.Device, deps.Logger) iotCard.SetPollingCallback(pollingLifecycleSvc) // 创建支付配置服务(Order 和 Recharge 依赖) wechatConfig := wechatConfigSvc.New(s.WechatConfig, s.Order, s.RechargeOrder, s.AgentRecharge, s.Payment, accountAudit, deps.Redis, deps.Logger) // 创建支付配置动态加载器(Order 和 Recharge 依赖) paymentLoader := payment.NewPaymentConfigLoader(s.WechatConfig, deps.Redis, deps.Logger) packageActivation := packageSvc.NewActivationService( deps.DB, deps.Redis, s.PackageUsage, s.Package, s.PackageUsageDailyRecord, deps.Logger, ) packageActivation.SetObservationSeriesEventWriter(observationSeriesEvents) stopResumeService := iotCardSvc.NewStopResumeService( deps.Redis, s.IotCard, s.PackageUsage, s.DeviceSimBinding, deps.GatewayClient, deps.Logger, assetAudit, ) stopResumeService.SetPollingCallback(pollingLifecycleSvc) stopResumeService.SetObservationSeriesEventWriter(deps.DB, observationSeriesEvents) iotCard.SetRealnameActivator(packageActivation) iotCard.SetStopResumeService(stopResumeService) iotCard.SetDeviceSimBindingStore(s.DeviceSimBinding) iotCard.SetEnterpriseCardAuthStore(s.EnterpriseCardAuthorization) iotCard.SetEnterpriseStore(s.Enterprise) iotCard.SetRedisClient(deps.Redis) device := deviceSvc.New( deps.DB, deps.Redis, s.Device, s.DeviceSimBinding, s.IotCard, s.Shop, s.AssetAllocationRecord, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.PackageSeries, deps.GatewayClient, s.AssetIdentifier, assetAudit, s.EnterpriseDeviceAuthorization, s.Enterprise, ) device.SetObservationSeriesEventWriter(observationSeriesEvents) device.SetObservationSeriesDispatcher(observationSeries) operationPassword := operationPasswordSvc.New(deps.Redis) shopCommission := shopCommissionSvc.New(s.Shop, s.Account, s.AgentWallet, s.CommissionWithdrawalRequest, s.CommissionWithdrawalSetting, s.CommissionRecord, s.AgentWalletTransaction, deps.DB, deps.Logger) packageService := packageSvc.New(s.Package, s.PackageSeries, s.ShopPackageAllocation, s.ShopSeriesAllocation) orderService := orderSvc.New(deps.DB, deps.Redis, s.Order, s.OrderItem, s.AgentWallet, s.AssetWallet, s.Payment, purchaseValidation, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.IotCard, s.Device, s.PackageSeries, s.PackageUsage, s.Package, wechatConfig, deps.WechatPayment, paymentLoader, deps.QueueClient, deps.Logger, s.AssetIdentifier, s.PersonalCustomer, s.PersonalCustomerPhone) orderService.SetObservationSeriesEventWriter(observationSeriesEvents) walletOutbox := outbox.NewRepository() walletDebitEvents := walletinfra.NewDebitEventWriter(walletOutbox) orderService.SetAgentWalletDebitService(walletapp.NewDebitService(walletDebitEvents, nil)) orderService.SetAgentWalletReservationService(walletapp.NewReservationService(walletinfra.NewReservationEventWriter(walletOutbox), walletDebitEvents, nil)) agentRechargeService := agentRechargeSvc.New( deps.DB, s.AgentRecharge, s.AgentWallet, s.Shop, wechatConfig, accountAudit, operationPassword, deps.Redis, deps.Logger, ) agentWalletPosting := walletapp.NewPostingService(walletinfra.NewCreditEventWriter(walletOutbox), nil) agentRechargeService.SetAgentWalletPostingService(agentWalletPosting) refundService := refundSvc.New( deps.DB, s.RefundRequest, s.Order, s.CommissionRecord, s.AgentWallet, s.AgentWalletTransaction, stopResumeService, device, packageActivation, s.IotCard, s.Device, s.AssetWallet, deps.Logger, ) refundService.SetAgentWalletRefundService(walletapp.NewRefundService(walletinfra.NewRefundEventWriter(walletOutbox), nil)) exchangeService := exchangeSvc.New(deps.DB, s.ExchangeOrder, s.IotCard, s.Device, s.AssetWallet, s.AssetWalletTransaction, s.PackageUsage, s.PackageUsageDailyRecord, s.ResourceTag, customerBinding, deps.Logger) exchangeService.SetShippingCreatedNotifier(exchangeApp.NewShippingCreatedNotifier(exchangeInfra.NewShippingNotificationWriter(outbox.NewRepository()))) assetService := assetSvc.New(deps.DB, s.Device, s.IotCard, s.PackageUsage, s.Package, s.PackageSeries, s.DeviceSimBinding, s.Shop, deps.Redis, iotCard, deps.GatewayClient, s.AssetIdentifier, s.Order, s.OrderItem, s.ExchangeOrder, assetAudit) agentOpenAPI := agentOpenAPISvc.New(assetService, packageService, orderService, shopCommission, stopResumeService, device, s.IotCard, s.PackageUsage, s.Package, s.PackageSeries, s.AgentWallet, s.DeviceSimBinding, s.Device) agentOpenAPI.SetObservationSeriesDispatcher(observationSeries) wecomApplicationRepository := wecomInfra.NewApplicationRepository(deps.DB) wecomSceneRepository := wecomInfra.NewSceneRepository(deps.DB) wecomMemberRepository := wecomInfra.NewMemberRepository(deps.DB) wecomBaseURL := "" wecomTimeout := constants.WeComDefaultHTTPTimeout var wecomCredentialCipher *wecomInfra.CredentialCipher if cfg := config.Get(); cfg != nil { wecomBaseURL = cfg.WeCom.BaseURL wecomTimeout = cfg.WeCom.Timeout wecomCredentialCipher, _ = wecomInfra.NewCredentialCipher(cfg.WeCom.CredentialEncryptionKey) } wecomIntegrationRepository := integrationlog.NewRepository(deps.DB) wecomTokenProvider := wecomInfra.NewTokenProvider( wecomApplicationRepository, wecomCredentialCipher, deps.Redis, wecomIntegrationRepository, wecomBaseURL, wecomTimeout, deps.Logger, ) approvalCreationService := approvalApp.NewCreationService( wecomInfra.NewApprovalProvider( deps.DB, wecomSceneRepository, wecomApplicationRepository, wecomMemberRepository, wecomInfra.NewTemplateClient(wecomTokenProvider, wecomIntegrationRepository, wecomBaseURL, wecomTimeout), ), approvalInfra.NewRepositoryProvider(), approvalInfra.NewSubmissionEventWriter(outbox.NewRepository()), nil, ) agentRechargeService.SetOfflineCreationService( agentrechargeApp.NewOfflineCreationService(deps.DB, approvalCreationService), ) refundService.SetRefundApprovalCreationService( refundapprovalApp.NewCreationService(deps.DB, approvalCreationService), ) return &services{ Approval: approvalCreationService, Account: account, AccountAudit: accountAudit, AssetAudit: assetAudit, Role: roleSvc.New(s.Role, s.Permission, s.RolePermission, s.AccountRole, s.ShopRole), Permission: permissionSvc.New(s.Permission, s.AccountRole, s.RolePermission, account, deps.Redis), PersonalCustomer: personalCustomerSvc.NewService(s.PersonalCustomer, s.PersonalCustomerPhone, deps.Logger), ClientAuth: clientAuthSvc.New( deps.DB, s.PersonalCustomerOpenID, s.PersonalCustomer, s.PersonalCustomerPhone, s.IotCard, s.Device, wechatConfig, deps.VerificationService, deps.JWTManager, deps.Redis, deps.Logger, customerBinding, ), Shop: shopSvc.New(s.Shop, s.Account, s.ShopRole, s.Role), Auth: authSvc.New(s.Account, s.AccountRole, s.RolePermission, s.Permission, s.Shop, deps.TokenManager, deps.Logger), ShopCommission: shopCommission, CommissionWithdrawal: commissionWithdrawalSvc.New(deps.DB, s.Shop, s.Account, s.AgentWallet, s.AgentWalletTransaction, s.CommissionWithdrawalRequest), CommissionWithdrawalSetting: commissionWithdrawalSettingSvc.New(deps.DB, s.Account, s.CommissionWithdrawalSetting), CommissionCalculation: commissionCalculationSvc.New( deps.DB, s.CommissionRecord, s.Shop, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.PackageSeries, s.IotCard, s.Device, s.AgentWallet, s.AgentWalletTransaction, s.Order, s.OrderItem, s.Package, s.ShopSeriesCommissionStats, commissionStatsSvc.New(s.ShopSeriesCommissionStats), deps.Logger, ), Enterprise: enterpriseSvc.New(deps.DB, s.Enterprise, s.Shop, s.Account), EnterpriseCard: enterpriseCardSvc.New(deps.DB, s.Enterprise, s.EnterpriseCardAuthorization, s.IotCard), EnterpriseDevice: enterpriseDeviceSvc.New(deps.DB, s.Enterprise, s.Device, s.DeviceSimBinding, s.EnterpriseDeviceAuthorization, s.EnterpriseCardAuthorization, deps.Logger), Authorization: enterpriseCardSvc.NewAuthorizationService(s.Enterprise, s.IotCard, s.EnterpriseCardAuthorization, deps.Logger), IotCard: iotCard, IotCardImport: iotCardImportSvc.New(deps.DB, s.IotCardImportTask, deps.QueueClient, assetAudit), ExportTask: exportTaskSvc.New(deps.DB, s.ExportTask, deps.QueueClient, deps.StorageService), Device: device, DeviceImport: deviceImportSvc.New(deps.DB, s.DeviceImportTask, deps.QueueClient, assetAudit), AssetAllocationRecord: assetAllocationRecordSvc.New(deps.DB, s.AssetAllocationRecord, s.Shop, s.Account), Carrier: carrierSvc.New(s.Carrier), PackageSeries: packageSeriesSvc.New(s.PackageSeries, s.ShopSeriesAllocation, s.Package), Package: packageService, PackageDailyRecord: packageSvc.NewDailyRecordService(deps.DB, deps.Redis, s.PackageUsageDailyRecord, deps.Logger), PackageCustomerView: packageSvc.NewCustomerViewService(deps.DB, deps.Redis, s.PackageUsage, deps.Logger), ShopPackageBatchAllocation: shopPackageBatchAllocationSvc.New(deps.DB, s.Package, s.ShopPackageAllocation, s.ShopSeriesAllocation, s.Shop, accountAudit), ShopPackageBatchPricing: shopPackageBatchPricingSvc.New(deps.DB, s.ShopPackageAllocation, s.ShopPackageAllocationPriceHistory, s.Shop), ShopSeriesGrant: shopSeriesGrantSvc.New(deps.DB, s.ShopSeriesAllocation, s.ShopPackageAllocation, s.ShopPackageAllocationPriceHistory, s.Shop, s.Package, s.PackageSeries, deps.Logger), CommissionStats: commissionStatsSvc.New(s.ShopSeriesCommissionStats), PurchaseValidation: purchaseValidation, Order: orderService, Exchange: exchangeService, Recharge: rechargeSvc.New(deps.DB, s.AssetWallet, s.AssetWalletTransaction, s.IotCard, s.Device, s.ShopSeriesAllocation, s.PackageSeries, s.CommissionRecord, wechatConfig, paymentLoader, deps.Logger), PollingConfig: pollingSvc.NewConfigService(s.PollingConfig, deps.Redis, deps.Logger), PollingConcurrency: pollingSvc.NewConcurrencyService(s.PollingConcurrencyConfig, deps.Redis), PollingMonitoring: pollingSvc.NewMonitoringServiceWithQueueMgr(deps.Redis, pollingQueueMgr, deps.Logger), PollingAlert: pollingSvc.NewAlertService(s.PollingAlertRule, s.PollingAlertHistory, deps.Redis, deps.Logger), PollingCleanup: pollingSvc.NewCleanupService(s.DataCleanupConfig, s.DataCleanupLog, deps.Logger), PollingManualTrigger: pollingSvc.NewManualTriggerService(s.PollingManualTriggerLog, s.IotCard, deps.Redis, deps.Logger), Asset: assetService, AssetLifecycle: assetSvc.NewLifecycleService(deps.DB, s.IotCard, s.Device, assetAudit), AssetWallet: assetWalletSvc.New(s.AssetWallet, s.AssetWalletTransaction), StopResumeService: stopResumeService, WechatConfig: wechatConfig, AgentRecharge: agentRechargeService, PackageActivation: packageActivation, TrafficQuery: trafficSvc.NewQueryService(deps.Redis, s.CardDailyUsage), OperationPassword: operationPassword, AgentOpenAPI: agentOpenAPI, Refund: refundService, CustomerBinding: customerBinding, OrderPackageInvalidate: orderPackageInvalidateSvc.New(s.OrderPackageInvalidateTask, deps.QueueClient), AssetPackageBatchOrder: assetPackageBatchOrderSvc.New(s.AssetPackageBatchOrderTask, s.Package, deps.QueueClient), ObservationSeries: observationSeries, CardObservation: cardObservationService, CardObservationSeries: cardObservationSeries, } }