diff --git a/internal/service/asset/service.go b/internal/service/asset/service.go index da24bee..2f10fa3 100644 --- a/internal/service/asset/service.go +++ b/internal/service/asset/service.go @@ -164,6 +164,7 @@ func (s *Service) buildDeviceResolveResponse(ctx context.Context, device *model. SwitchMode: device.SwitchMode, LastGatewaySyncAt: device.LastGatewaySyncAt, EnablePolling: device.EnablePolling, + RealnamePolicy: device.RealnamePolicy, } // 查绑定卡 @@ -250,6 +251,7 @@ func (s *Service) buildCardResolveResponse(ctx context.Context, card *model.IotC UpdatedAt: card.UpdatedAt, RealNameStatus: card.RealNameStatus, RealNameAt: card.FirstRealnameAt, + RealnamePolicy: card.RealnamePolicy, NetworkStatus: card.NetworkStatus, ICCID: card.ICCID, CarrierID: card.CarrierID, @@ -999,6 +1001,72 @@ func paymentStatusText(status int) string { } } +// GetEffectiveRealnamePolicy 获取资产的有效实名认证策略 +// 设备卡使用设备策略,单独卡使用卡策略 +func GetEffectiveRealnamePolicy(card *model.IotCard, device *model.Device) string { + if device != nil { + return device.RealnamePolicy + } + if card != nil { + return card.RealnamePolicy + } + return constants.RealnamePolicyNone +} + +// HasValidRechargeOrPaidOrder 检查资产在当前世代是否有有效充值或已支付订单 +// 用于 after_order 策略的生效条件判断 +func (s *Service) HasValidRechargeOrPaidOrder(ctx context.Context, assetType string, assetID uint) (bool, error) { + generation := s.resolveAssetGeneration(ctx, assetType, assetID) + + if assetType == "card" { + var rechargeCount int64 + err := s.db.WithContext(ctx).Model(&model.RechargeOrder{}). + Where("iot_card_id = ? AND generation = ? AND status = ?", assetID, generation, model.RechargeOrderStatusPaid). + Count(&rechargeCount).Error + if err != nil { + return false, errors.Wrap(errors.CodeDatabaseError, err, "查询卡充值订单失败") + } + if rechargeCount > 0 { + return true, nil + } + + var orderCount int64 + err = s.db.WithContext(ctx).Model(&model.Order{}). + Where("iot_card_id = ? AND generation = ? AND payment_status = ?", assetID, generation, model.PaymentStatusPaid). + Count(&orderCount).Error + if err != nil { + return false, errors.Wrap(errors.CodeDatabaseError, err, "查询卡订单失败") + } + if orderCount > 0 { + return true, nil + } + } else if assetType == "device" { + var rechargeCount int64 + err := s.db.WithContext(ctx).Model(&model.RechargeOrder{}). + Where("device_id = ? AND generation = ? AND status = ?", assetID, generation, model.RechargeOrderStatusPaid). + Count(&rechargeCount).Error + if err != nil { + return false, errors.Wrap(errors.CodeDatabaseError, err, "查询设备充值订单失败") + } + if rechargeCount > 0 { + return true, nil + } + + var orderCount int64 + err = s.db.WithContext(ctx).Model(&model.Order{}). + Where("device_id = ? AND generation = ? AND payment_status = ?", assetID, generation, model.PaymentStatusPaid). + Count(&orderCount).Error + if err != nil { + return false, errors.Wrap(errors.CodeDatabaseError, err, "查询设备订单失败") + } + if orderCount > 0 { + return true, nil + } + } + + return false, nil +} + // packageStatusName 套餐状态码转中文名称 func packageStatusName(status int) string { switch status {