This commit is contained in:
@@ -143,6 +143,9 @@ func (s *DeviceStore) applyDeviceFilters(query *gorm.DB, filters map[string]any)
|
||||
if status, ok := filters["status"].(int); ok && status > 0 {
|
||||
query = query.Where("status = ?", status)
|
||||
}
|
||||
if activationStatus, ok := filters["activation_status"].(int); ok {
|
||||
query = s.applyActivationStatusFilter(query, activationStatus)
|
||||
}
|
||||
if shopIDs, ok := filters["shop_ids"].([]uint); ok {
|
||||
if len(shopIDs) == 0 {
|
||||
query = query.Where("1 = 0")
|
||||
@@ -177,6 +180,37 @@ func (s *DeviceStore) applyDeviceFilters(query *gorm.DB, filters map[string]any)
|
||||
return query
|
||||
}
|
||||
|
||||
func (s *DeviceStore) applyActivationStatusFilter(query *gorm.DB, activationStatus int) *gorm.DB {
|
||||
activeCondition := `EXISTS (
|
||||
SELECT 1
|
||||
FROM tb_package_usage AS pu
|
||||
JOIN tb_device_sim_binding AS b
|
||||
ON b.device_id = pu.device_id
|
||||
AND b.bind_status = ?
|
||||
AND b.deleted_at IS NULL
|
||||
JOIN tb_iot_card AS c
|
||||
ON c.id = b.iot_card_id
|
||||
AND c.real_name_status = ?
|
||||
AND c.deleted_at IS NULL
|
||||
WHERE pu.device_id = tb_device.id
|
||||
AND pu.status = ?
|
||||
AND pu.master_usage_id IS NULL
|
||||
AND pu.deleted_at IS NULL
|
||||
)`
|
||||
args := []any{
|
||||
constants.BindStatusBound,
|
||||
constants.RealNameStatusVerified,
|
||||
constants.PackageUsageStatusActive,
|
||||
}
|
||||
if activationStatus == constants.ActivationStatusActive {
|
||||
return query.Where(activeCondition, args...)
|
||||
}
|
||||
if activationStatus == constants.ActivationStatusInactive {
|
||||
return query.Where("NOT "+activeCondition, args...)
|
||||
}
|
||||
return query
|
||||
}
|
||||
|
||||
// GetByFilters 根据筛选条件查询设备
|
||||
// 用于批量设置套餐系列时选择完整筛选结果,不受列表分页限制。
|
||||
func (s *DeviceStore) GetByFilters(ctx context.Context, filters map[string]any) ([]*model.Device, error) {
|
||||
@@ -206,6 +240,38 @@ func (s *DeviceStore) BatchUpdateShopIDAndStatus(ctx context.Context, ids []uint
|
||||
return s.db.WithContext(ctx).Model(&model.Device{}).Where("id IN ?", ids).Updates(updates).Error
|
||||
}
|
||||
|
||||
// GetActivationStatusMap 批量查询设备激活状态。
|
||||
// 设备激活规则:存在生效中主套餐,且任意已绑定卡已实名。
|
||||
func (s *DeviceStore) GetActivationStatusMap(ctx context.Context, ids []uint) (map[uint]int, error) {
|
||||
result := make(map[uint]int, len(ids))
|
||||
if len(ids) == 0 {
|
||||
return result, nil
|
||||
}
|
||||
for _, id := range ids {
|
||||
result[id] = constants.ActivationStatusInactive
|
||||
}
|
||||
|
||||
var activeDeviceIDs []uint
|
||||
err := s.db.WithContext(ctx).
|
||||
Table("tb_package_usage AS pu").
|
||||
Distinct("pu.device_id").
|
||||
Joins("JOIN tb_device_sim_binding AS b ON b.device_id = pu.device_id AND b.bind_status = ? AND b.deleted_at IS NULL", constants.BindStatusBound).
|
||||
Joins("JOIN tb_iot_card AS c ON c.id = b.iot_card_id AND c.real_name_status = ? AND c.deleted_at IS NULL", constants.RealNameStatusVerified).
|
||||
Where("pu.device_id IN ?", ids).
|
||||
Where("pu.status = ?", constants.PackageUsageStatusActive).
|
||||
Where("pu.master_usage_id IS NULL").
|
||||
Where("pu.deleted_at IS NULL").
|
||||
Pluck("pu.device_id", &activeDeviceIDs).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, id := range activeDeviceIDs {
|
||||
result[id] = constants.ActivationStatusActive
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *DeviceStore) ExistsByDeviceNoBatch(ctx context.Context, deviceNos []string) (map[string]bool, error) {
|
||||
result := make(map[string]bool)
|
||||
if len(deviceNos) == 0 {
|
||||
|
||||
Reference in New Issue
Block a user