From ba73913a413f18bb9ac994db1e39a4ba55822f15 Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 24 Apr 2026 09:25:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=8D=A1=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/gateway/models.go | 1 + internal/service/asset/service.go | 13 +++-- .../postgres/device_sim_binding_store.go | 48 ++++++------------- 3 files changed, 21 insertions(+), 41 deletions(-) diff --git a/internal/gateway/models.go b/internal/gateway/models.go index 45bff14..5b49df1 100644 --- a/internal/gateway/models.go +++ b/internal/gateway/models.go @@ -222,6 +222,7 @@ type SyncDeviceInfoResp struct { DeviceName FlexString `json:"device_name" description:"设备名称"` IMEI FlexString `json:"imei" description:"IMEI号"` CurrentIccid FlexString `json:"current_iccid" description:"当前使用的ICCID"` + CurrentSlotNo FlexInt `json:"current_slot_number" description:"当前使用卡槽号(逻辑槽位,1开始)"` DeviceType FlexString `json:"device_type" description:"设备类型:1=诺行,2=玺龙,3=迎势达"` SoftwareVersion FlexString `json:"software_version" description:"软件版本号"` MacAddress FlexString `json:"mac_address" description:"MAC地址"` diff --git a/internal/service/asset/service.go b/internal/service/asset/service.go index 7800a8f..71dd4b0 100644 --- a/internal/service/asset/service.go +++ b/internal/service/asset/service.go @@ -611,13 +611,12 @@ func (s *Service) updateDeviceFromSyncInfo(ctx context.Context, deviceID uint, r return } - if string(resp.CurrentIccid) != "" { - // 更新 is_current 标识(事务原子操作,per D-14 决策) - if err := s.deviceSimBindingStore.UpdateIsCurrentByDeviceID(ctx, deviceID, string(resp.CurrentIccid)); err != nil { - logger.GetAppLogger().Warn("sync-info 更新 is_current 失败", - zap.Uint("device_id", deviceID), - zap.Error(err)) - } + // 更新 is_current 标识(事务原子操作,按 current_slot_number 逻辑槽位更新) + if err := s.deviceSimBindingStore.UpdateIsCurrentByDeviceID(ctx, deviceID, int(resp.CurrentSlotNo)); err != nil { + logger.GetAppLogger().Warn("sync-info 更新 is_current 失败", + zap.Uint("device_id", deviceID), + zap.Int("current_slot_number", int(resp.CurrentSlotNo)), + zap.Error(err)) } } diff --git a/internal/store/postgres/device_sim_binding_store.go b/internal/store/postgres/device_sim_binding_store.go index d592eca..4917fd5 100644 --- a/internal/store/postgres/device_sim_binding_store.go +++ b/internal/store/postgres/device_sim_binding_store.go @@ -229,9 +229,9 @@ func (s *DeviceSimBindingStore) GetBoundICCIDs(ctx context.Context, iccids []str } // UpdateIsCurrentByDeviceID 原子更新设备当前使用的卡标识 -// 使用事务两步操作:先全部设为 false,再将 currentIccid 对应行设为 true -// currentIccid 为空字符串时,仅执行全部清空(无当前卡的情况) -func (s *DeviceSimBindingStore) UpdateIsCurrentByDeviceID(ctx context.Context, deviceID uint, currentIccid string) error { +// 使用事务两步操作:先全部设为 false,再将 currentSlotNumber 对应插槽设为 true。 +// currentSlotNumber <= 0 时,仅执行全部清空(无当前卡的情况)。 +func (s *DeviceSimBindingStore) UpdateIsCurrentByDeviceID(ctx context.Context, deviceID uint, currentSlotNumber int) error { return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { if err := tx.Model(&model.DeviceSimBinding{}). Where("device_id = ? AND bind_status = 1", deviceID). @@ -239,42 +239,22 @@ func (s *DeviceSimBindingStore) UpdateIsCurrentByDeviceID(ctx context.Context, d return err } - if currentIccid == "" { + if currentSlotNumber <= 0 { return nil } - var column string - switch len(currentIccid) { - case 19: - column = "iccid_19" - case 20: - column = "iccid_20" - default: - logger.GetAppLogger().Error("UpdateIsCurrentByDeviceID: ICCID 长度异常,跳过 is_current 更新", - zap.String("iccid", currentIccid), + result := tx.Model(&model.DeviceSimBinding{}). + Where("device_id = ? AND slot_position = ? AND bind_status = 1", deviceID, currentSlotNumber). + Update("is_current", true) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + logger.GetAppLogger().Warn("UpdateIsCurrentByDeviceID: 未命中插槽绑定记录,is_current 不更新", zap.Uint("device_id", deviceID), - zap.Int("length", len(currentIccid)), + zap.Int("current_slot_number", currentSlotNumber), ) - return nil } - - var iotCardID uint - if err := tx.Table("tb_iot_card"). - Select("id"). - Where(column+" = ? AND deleted_at IS NULL", currentIccid). - Scan(&iotCardID).Error; err != nil { - return err - } - if iotCardID == 0 { - logger.GetAppLogger().Warn("UpdateIsCurrentByDeviceID: 未命中卡记录,is_current 不更新", - zap.String("iccid", currentIccid), - zap.Uint("device_id", deviceID), - zap.String("column_used", column), - ) - return nil - } - return tx.Model(&model.DeviceSimBinding{}). - Where("device_id = ? AND iot_card_id = ? AND bind_status = 1", deviceID, iotCardID). - Update("is_current", true).Error + return nil }) }