@@ -118,3 +118,59 @@ func GetDeviceTemplateMenu(req *model.GetDeviceTemplateMenuReq, claims *utils.Us
118118 return data , err
119119
120120}
121+
122+ // GetDeviceTemplateStats 获取设备物模型统计信息
123+ func GetDeviceTemplateStats (deviceTemplateID string , tenantID string ) (* model.GetDeviceTemplateStatsRsp , error ) {
124+ ctx := context .Background ()
125+
126+ // 查询物模型基本信息
127+ dt := query .DeviceTemplate
128+ template , err := dt .WithContext (ctx ).
129+ Where (dt .ID .Eq (deviceTemplateID ), dt .TenantID .Eq (tenantID )).
130+ First ()
131+ if err != nil {
132+ logrus .Error ("query device template error: " , err )
133+ return nil , err
134+ }
135+
136+ // 统计关联设备总数和在线设备数
137+ // 通过 device_configs 表关联 devices 表
138+ dc := query .DeviceConfig
139+ d := query .Device
140+
141+ // 统计总设备数
142+ totalDevices , err := d .WithContext (ctx ).
143+ Join (dc , dc .ID .EqCol (d .DeviceConfigID )).
144+ Where (dc .DeviceTemplateID .Eq (deviceTemplateID ), d .TenantID .Eq (tenantID )).
145+ Count ()
146+ if err != nil {
147+ logrus .Error ("query total devices error: " , err )
148+ return nil , err
149+ }
150+
151+ // 统计在线设备数
152+ onlineDevices , err := d .WithContext (ctx ).
153+ Join (dc , dc .ID .EqCol (d .DeviceConfigID )).
154+ Where (dc .DeviceTemplateID .Eq (deviceTemplateID ), d .TenantID .Eq (tenantID ), d .IsOnline .Eq (1 )).
155+ Count ()
156+ if err != nil {
157+ logrus .Error ("query online devices error: " , err )
158+ return nil , err
159+ }
160+
161+ // 构造返回结果
162+ label := ""
163+ if template .Label != nil {
164+ label = * template .Label
165+ }
166+
167+ result := & model.GetDeviceTemplateStatsRsp {
168+ DeviceTemplateID : template .ID ,
169+ Name : template .Name ,
170+ Label : label ,
171+ TotalDevices : totalDevices ,
172+ OnlineDevices : onlineDevices ,
173+ }
174+
175+ return result , nil
176+ }
0 commit comments