package dao import ( "fmt" "server/global" "time" ) type Device struct { global.GVA_MODEL Sn string `json:"sn" gorm:"column:sn;comment:设备sn"` Ip string `json:"ip" gorm:"column:ip;comment:ip"` RegionId int `json:"regionId" gorm:"column:region_id;comment:地区id"` Region *Region `json:"region" gorm:"foreignKey:RegionId;references:ID"` Name string `json:"name" gorm:"column:name;comment:名称"` State int `json:"state" gorm:"column:state;comment:状态"` Remark string `json:"remark" gorm:"column:remark;comment:备注"` IsSun bool `json:"isSun" gorm:"column:is_sun;comment:是否太阳能"` LoopNumber int `json:"loopNumber" gorm:"column:loop_number;comment:回路数量"` OnlineTime time.Time `json:"onlineTime" gorm:"column:online_time;default:null;comment:在线时间"` DeviceLoops []DeviceLoop `json:"deviceLoops"` Sun Sun `json:"sun"` RelayStatus []int `gorm:"-" json:"relayStatus"` //回路状态 RelayTimeStr []string `gorm:"-" json:"relayTimeStr"` //回路时间设置 } func (Device) TableName() string { return "device" } func QueryAllDevices() (devices []Device, err error) { err = global.GVA_DB.Find(&devices).Error return devices, err } func GetOnlineDevices() (devices []Device, err error) { err = global.GVA_DB.Where("state = 1").Preload("DeviceLoops").Find(&devices).Error return devices, err } func QueryDeviceByIp(ip string) (device Device, err error) { err = global.GVA_DB.Where("ip = ?", ip).First(&device).Error return device, err } func QueryDeviceById(id int) (device Device, err error) { err = global.GVA_DB.Where("id = ?", id).First(&device).Error return device, err } func QueryDeviceList(name, sn string, regionId, limit, offset int) (devices []Device, total int64, err error) { db := global.GVA_DB.Model(&Device{}).Preload("DeviceLoops").Preload("Region") // 如果有条件搜索 下方会自动创建搜索语句 if sn != "" { db = db.Where("sn LIKE ?", "%"+sn+"%") } if name != "" { db = db.Where("name LIKE ?", "%"+name+"%") } if regionId != 0 { db = db.Where("region_id = ?", regionId) } err = db.Count(&total).Error if err != nil { return nil, 0, err } err = db.Order("name asc").Limit(limit).Offset(offset).Find(&devices).Error return devices, total, err } func QueryDevicesByRegionId(regionId int) (devices []Device, err error) { err = global.GVA_DB.Where("region_id = ?", regionId).Find(&devices).Error return devices, err } func QueryDeviceByIds(ids []int) (devices []Device, err error) { err = global.GVA_DB.Where("id in (?)", ids).Find(&devices).Error return devices, err } func (d Device) CreateDevice() error { return global.GVA_DB.Create(&d).Error } func (d Device) UpdateDevice() error { return global.GVA_DB.Where("id = ?", d.ID).Updates(&d).Error } func UpdateDeviceByMapAndSn(data map[string]interface{}, sn string) error { return global.GVA_DB.Model(&Device{}).Where("sn = ?", sn).Updates(data).Error } func DeleteDevice(id int) error { return global.GVA_DB.Where("id = ?", id).Unscoped().Delete(&Device{}).Error } func BatchUpdateDeviceTime(ids []int, timeCondition1OnTime, timeCondition1OffTime, timeCondition2OnTime, timeCondition2OffTime string) error { updateData := map[string]interface{}{ "time_condition_1_on_time": timeCondition1OnTime, "time_condition_1_off_time": timeCondition1OffTime, "time_condition_2_on_time": timeCondition2OnTime, "time_condition_2_off_time": timeCondition2OffTime, } return global.GVA_DB.Model(&DeviceLoop{}). Where("device_id IN (?)", ids). Updates(updateData).Error } func BatchUpdateRegionTime(regionId int, timeCondition1OnTime, timeCondition1OffTime, timeCondition2OnTime, timeCondition2OffTime string) error { updateData := map[string]interface{}{ "time_condition_1_on_time": timeCondition1OnTime, "time_condition_1_off_time": timeCondition1OffTime, "time_condition_2_on_time": timeCondition2OnTime, "time_condition_2_off_time": timeCondition2OffTime, } var deviceIds []int // 1. 查询该地区所有设备ID,捕获查询错误 tx := global.GVA_DB.Begin() if tx.Error != nil { return fmt.Errorf("开启事务失败: %w", tx.Error) } if err := tx.Model(&Device{}). Select("id"). Where("region_id = ?", regionId). Find(&deviceIds).Error; err != nil { _ = tx.Rollback() return fmt.Errorf("查询地区设备失败: %w", err) } if len(deviceIds) == 0 { _ = tx.Rollback() return fmt.Errorf("regionId=%d 下未查询到任何设备", regionId) } // 2. 批量更新该地区所有设备的回路时控 if err := tx.Model(&DeviceLoop{}). Where("device_id IN (?)", deviceIds). Updates(updateData).Error; err != nil { _ = tx.Rollback() return fmt.Errorf("批量更新回路时控失败: %w", err) } // 全部成功提交事务 if err := tx.Commit().Error; err != nil { _ = tx.Rollback() return fmt.Errorf("事务提交失败: %w", err) } return nil }