From 1d75a4c31a7c956cbc0f5e66948f6f3a2f37ad3b Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Apr 2026 17:29:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20asset=20Service=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?GetEffectiveRealnamePolicy=20=E7=AD=96=E7=95=A5=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=8F=8A=20HasValidRechargeOrPaidOrder=20=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- internal/service/asset/service.go | 68 +++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) 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 {