feat: asset Service 新增 GetEffectiveRealnamePolicy 策略判断及 HasValidRechargeOrPaidOrder 检查逻辑

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-17 17:29:32 +08:00
parent 89eec1406a
commit 1d75a4c31a

View File

@@ -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 {