fix: 记录查询扫描结构显式指定列名,修复 ICCID 一直为空
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled

GORM 默认把字段 ICCID 映射成 icc_id,卡日流量的 c.iccid 和展示字段批量查询都读不到值;
扫描用的匿名结构统一写 gorm column tag。
This commit is contained in:
邹进
2026-11-07 17:33:28 +09:00
parent 3f593b912d
commit eb0d86df4f
2 changed files with 19 additions and 17 deletions

View File

@@ -47,9 +47,10 @@ func Load(ctx context.Context, db *gorm.DB, req Request) (*Lookup, error) {
session := db.WithContext(ctx).Unscoped()
if ids := distinct(req.CardIDs); len(ids) > 0 {
// 显式列名:GORM 默认把字段 ICCID 映射成 icc_id,不写 tag 会读不到值。
var rows []struct {
ID uint
ICCID string
ID uint `gorm:"column:id"`
ICCID string `gorm:"column:iccid"`
}
if err := session.Model(&model.IotCard{}).Select("id, iccid").Where("id IN ?", ids).Scan(&rows).Error; err != nil {
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询卡展示信息失败")
@@ -60,9 +61,9 @@ func Load(ctx context.Context, db *gorm.DB, req Request) (*Lookup, error) {
}
if ids := distinct(req.DeviceIDs); len(ids) > 0 {
var rows []struct {
ID uint
VirtualNo string
IMEI string
ID uint `gorm:"column:id"`
VirtualNo string `gorm:"column:virtual_no"`
IMEI string `gorm:"column:imei"`
}
if err := session.Model(&model.Device{}).Select("id, virtual_no, imei").Where("id IN ?", ids).Scan(&rows).Error; err != nil {
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询设备展示信息失败")
@@ -73,8 +74,8 @@ func Load(ctx context.Context, db *gorm.DB, req Request) (*Lookup, error) {
}
if ids := distinct(req.CarrierIDs); len(ids) > 0 {
var rows []struct {
ID uint
CarrierName string
ID uint `gorm:"column:id"`
CarrierName string `gorm:"column:carrier_name"`
}
if err := session.Model(&model.Carrier{}).Select("id, carrier_name").Where("id IN ?", ids).Scan(&rows).Error; err != nil {
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询运营商账户展示信息失败")
@@ -85,8 +86,8 @@ func Load(ctx context.Context, db *gorm.DB, req Request) (*Lookup, error) {
}
if ids := distinct(req.OperatorIDs); len(ids) > 0 {
var rows []struct {
ID uint
Username string
ID uint `gorm:"column:id"`
Username string `gorm:"column:username"`
}
if err := session.Model(&model.Account{}).Select("id, username").Where("id IN ?", ids).Scan(&rows).Error; err != nil {
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询操作人展示信息失败")
@@ -97,8 +98,8 @@ func Load(ctx context.Context, db *gorm.DB, req Request) (*Lookup, error) {
}
if ids := distinct(req.PackageUsageIDs); len(ids) > 0 {
var rows []struct {
ID uint
PackageName string
ID uint `gorm:"column:id"`
PackageName string `gorm:"column:package_name"`
}
if err := session.Model(&model.PackageUsage{}).Select("id, package_name").Where("id IN ?", ids).Scan(&rows).Error; err != nil {
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询套餐名称失败")

View File

@@ -257,10 +257,11 @@ func (s *Service) ListCardDailyUsages(ctx context.Context, req *dto.CardDailyUsa
if err != nil || scope.empty() {
return resp, err
}
// 显式列名:GORM 默认把字段 ICCID 映射成 icc_id,不写 tag 时 ICCID 一直为空。
type row struct {
model.CardFlowDay
ICCID string
CarrierID uint
ICCID string `gorm:"column:iccid"`
CarrierID uint `gorm:"column:carrier_id"`
}
query := s.db.WithContext(ctx).Table("tb_card_flow_day AS u").
Select("u.*, c.iccid, c.carrier_id").Joins("LEFT JOIN tb_iot_card c ON c.id = u.iot_card_id").
@@ -312,10 +313,10 @@ func (s *Service) ListPackageUsageDailyRecords(ctx context.Context, req *dto.Pac
}
type row struct {
model.PackageUsageDailyRecord
PackageID uint
PackageName string
IotCardID uint
DeviceID uint
PackageID uint `gorm:"column:package_id"`
PackageName string `gorm:"column:package_name"`
IotCardID uint `gorm:"column:iot_card_id"`
DeviceID uint `gorm:"column:device_id"`
}
query := s.db.WithContext(ctx).Table("tb_package_usage_daily_record AS r").
Select("r.*, pu.package_id, pu.package_name, COALESCE(pu.iot_card_id, 0) AS iot_card_id, COALESCE(pu.device_id, 0) AS device_id").