lampcontroller.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package models
  2. import "errors"
  3. //路灯控制器,数据来自web
  4. //海蓝加入这个的通讯编码、设备编码(SN)
  5. //目前使用控制器的通讯编码来进行控制。(设备编码在控制器的标贴上) 通讯编码是控制器上路安装后,我司远程组网后生成的通讯地址(通讯编码)。
  6. //这个在我司项目交付前,会统一提供每盏灯具的通讯编码、设备编码(SN)和经纬度
  7. type DeviceLampController struct {
  8. ID string `gorm:"type:varchar(32);primary_key"` //设备ID,DID //海蓝通信编码
  9. Name string `gorm:"type:varchar(64)"` //灯控名称
  10. GID string `gorm:"type:varchar(32)"` //网关ID
  11. Brand int `gorm:"type:int"` //品牌
  12. Model int `gorm:"type:int"` //型号
  13. CtlType int `gorm:"type:int"` //单灯控制器类型,nb-iot:1,485:2,zigbee:3,zigbeehl:4
  14. Concentrator string `gorm:"type:varchar(32)"` //集中器编号,zigbee灯控专用,其他类型灯控置空
  15. Netid int `gorm:"type:int"` //网络号,zigbee灯控专用,其他类型灯控置0
  16. Channel int `gorm:"type:int"` //通道号,zigbee灯控专用,其他类型灯控置0
  17. Number uint16 `gorm:"type:int"` //灯编号, zigbee灯控专用,其他类型灯控置0
  18. OrgNumber string `gorm:"type:varchar(32)"` //灯编号, zigbee灯控专用,设备上原始的编号,字符串类型
  19. Strategy string `gorm:"type:varchar(32)"` //关联的策略编码,无则置空,多个则用逗号分开,暂时只支持一个
  20. Tenant string `gorm:"type:varchar(8)"` //租户ID
  21. State int `gorm:"type:int"` //1启用,0禁用
  22. TID int `gorm:"type:int"` //物模型ID
  23. //LcModel
  24. }
  25. func (DeviceLampController) TableName() string {
  26. //从视图查
  27. return "t_device_lampcontroller"
  28. }
  29. func (o DeviceLampController) Delete() error {
  30. return G_db.Model(&o).Updates(map[string]interface{}{"state": 0}).Error
  31. }
  32. func (o DeviceLampController) IsExistedByCode() (bool, error) {
  33. var count int = 0
  34. err := G_db.Model(&o).Where(" id = ? ", o.ID).Count(&count).Error
  35. return count > 0, err
  36. }
  37. func IsExistedByConcentrator(concentrator string, number uint16) ([]DeviceLampController, error) {
  38. var result []DeviceLampController
  39. err := G_db.Model(&DeviceLampController{}).Where("concentrator = ? and number = ? and state = 1", concentrator, number).Find(&result).Error
  40. return result, err
  41. }
  42. func UpdateDeviceLampControllerTID(code string, tid int) error {
  43. return nil
  44. sql := `UPDATE t_device_lampcontroller SET t_id = ? WHERE id = ?;`
  45. return G_db.Raw(sql, tid, code).Error
  46. }
  47. //设备创建和更新
  48. func (o DeviceLampController) SaveFromWeb(ctlType int) error {
  49. //检查要更新的灯控的集控器、编号是否已存在并且当前处于有效状态
  50. var (
  51. conflict = false
  52. update = false
  53. has = false
  54. err error
  55. )
  56. if ctlType == 3 {
  57. arrlamp, err := IsExistedByConcentrator(o.Concentrator, o.Number)
  58. if err != nil {
  59. return err
  60. }
  61. if len(arrlamp) > 0 {
  62. conflict = true
  63. }
  64. if len(arrlamp) == 1 && arrlamp[0].ID == o.ID {
  65. update = true
  66. conflict = false
  67. }
  68. }
  69. //冲突给出提示,不做任何更新或创建
  70. if conflict {
  71. return errors.New("数据错误,请确保灯控与系统中其他灯控的集控器和编号不重复")
  72. }
  73. //根据ID判断是否已存在
  74. if !update {
  75. has, err = o.IsExistedByCode()
  76. if err != nil {
  77. return err
  78. }
  79. }
  80. if has || update {
  81. mapCol := make(map[string]interface{})
  82. mapCol["name"] = o.Name
  83. mapCol["g_id"] = o.GID
  84. mapCol["brand"] = o.Brand
  85. mapCol["model"] = o.Model
  86. mapCol["ctl_type"] = o.CtlType
  87. mapCol["concentrator"] = o.Concentrator
  88. mapCol["netid"] = o.Netid
  89. mapCol["channel"] = o.Channel
  90. mapCol["number"] = o.Number
  91. mapCol["org_number"] = o.OrgNumber
  92. mapCol["strategy"] = o.Strategy
  93. mapCol["tenant"] = o.Tenant
  94. mapCol["state"] = o.State
  95. return G_db.Model(&o).Updates(mapCol).Error
  96. }
  97. return G_db.Create(&o).Error
  98. }
  99. func LampControllerUpdateState(id string, state int) error {
  100. return G_db.Model(DeviceLampController{}).Where("id = ?", id).Updates(map[string]interface{}{"state": state}).Error
  101. }
  102. //策略更新
  103. func UpdateStrategy(code []string, strategy string) error {
  104. return G_db.Model(&DeviceLampController{}).Where("id in (?)",
  105. code).Update(map[string]interface{}{"strategy": strategy}).Error
  106. }
  107. type ZigbeeLamp struct {
  108. ID string
  109. GID string
  110. Number int
  111. }
  112. type ZigbeeHlLamp struct {
  113. ID string //灯id
  114. GID string //网关id
  115. Concentrator string //集控id
  116. }
  117. //ctl_type = 3 为zigbee
  118. func GetLampControllerByConcentrator(concentrator string) ([]ZigbeeLamp, error) {
  119. var lamp []ZigbeeLamp
  120. err := G_db.Model(&DeviceLampController{}).Select([]string{"id", "g_id",
  121. "number"}).Where("concentrator = ? and ctl_type = 3 and number > 0 ", concentrator).Scan(&lamp).Error
  122. return lamp, err
  123. }
  124. //ctl_type = 4 为HLzigbee
  125. func GetLampHlControllerByConcentrator(concentrator string) ([]ZigbeeHlLamp, error) {
  126. var lamp []ZigbeeHlLamp //id,gid
  127. err := G_db.Model(&DeviceLampController{}).Select([]string{"id", "g_id",
  128. "concentrator"}).Where("concentrator = ? and ctl_type = 4", concentrator).Scan(&lamp).Error
  129. return lamp, err
  130. }
  131. type LampControllerData struct {
  132. ID string
  133. GID string
  134. CtlType int //单灯控制器类型,nb-iot:1,485:2,zigbee:3
  135. Concentrator string //集中器编号,zigbee灯控专用,其他类型灯控置空
  136. Number uint16 //灯编号, zigbee灯控专用,其他类型灯控置0
  137. }
  138. //获取灯控
  139. func GetLampControllerByID(codes []string) ([]LampControllerData, error) {
  140. var lamp []LampControllerData
  141. err := G_db.Model(&DeviceLampController{}).Select([]string{"id", "g_id", "ctl_type",
  142. "concentrator", "number"}).Where("id in ( ? ) ", codes).Scan(&lamp).Error
  143. return lamp, err
  144. }
  145. type ZigbeeLampStrategy struct {
  146. ID string
  147. GID string
  148. Tenant string
  149. Concentrator string //集控器
  150. Number int
  151. Strategy string
  152. Sunset int
  153. TimeInfo string
  154. Longitude float64
  155. Latitude float64
  156. }
  157. //根据集控器编码,获取策略设置为日出日落的zigbee灯控
  158. func GetZigbeeLampstrategyByconcentrator(concentrator string) ([]ZigbeeLampStrategy, error) {
  159. var zls []ZigbeeLampStrategy
  160. sql := `SELECT a.id,a.g_id,a.tenant,a.concentrator,a.number,a.strategy,b.sunset,b.time_info,b.longitude,b.latitude FROM
  161. (SELECT id,g_id,tenant,concentrator,number,strategy FROM t_device_lampcontroller WHERE concentrator = ? AND ctl_type = 3) a,
  162. (SELECT id,sunset,time_info,longitude,latitude FROM t_lamp_strategy WHERE sunset = 1) b
  163. WHERE a.strategy = b.id`
  164. err := G_db.Raw(sql, concentrator).Scan(&zls).Error
  165. return zls, err
  166. }
  167. //海蓝根据集控器编码,获取策略设置为日出日落的zigbee灯控
  168. func GetHLZigbeeLampstrategyByconcentrator(concentrator string) ([]ZigbeeLampStrategy, error) {
  169. var zls []ZigbeeLampStrategy
  170. sql := `SELECT a.id,a.g_id,a.tenant,a.concentrator,a.number,a.strategy,b.sunset,b.time_info,b.longitude,b.latitude FROM
  171. (SELECT id,g_id,tenant,concentrator,number,strategy FROM t_device_lampcontroller WHERE concentrator = ? AND (ctl_type = 4 OR number >= 65500 )) a,
  172. (SELECT id,sunset,time_info,longitude,latitude FROM t_lamp_strategy WHERE sunset = 1) b
  173. WHERE a.strategy = b.id`
  174. err := G_db.Raw(sql, concentrator).Scan(&zls).Error
  175. return zls, err
  176. }
  177. //根据灯控编码列表,获取所有zigbee灯控
  178. func GetZigbeeLampStrategyByIDs(IDs []string) ([]ZigbeeLampStrategy, error) {
  179. var zls []ZigbeeLampStrategy
  180. sql := `SELECT a.id,a.g_id,a.tenant,a.concentrator,a.number,a.strategy,b.sunset,b.time_info,b.longitude,b.latitude FROM
  181. (SELECT id,g_id,tenant,concentrator,number,strategy FROM t_device_lampcontroller WHERE id IN (?) AND ctl_type = 3 ) a,
  182. (SELECT id,sunset,time_info,longitude,latitude FROM t_lamp_strategy) b
  183. WHERE a.strategy = b.id`
  184. err := G_db.Raw(sql, IDs).Scan(&zls).Error
  185. return zls, err
  186. }
  187. //海蓝根据灯控编码列表,获取所有hlzigbee灯控
  188. func GetHLZigbeeLampStrategyByIDs(IDs []string) ([]ZigbeeLampStrategy, error) {
  189. var zls []ZigbeeLampStrategy
  190. sql := `SELECT a.id,a.g_id,a.tenant,a.concentrator,a.number,a.strategy,b.sunset,b.time_info,b.longitude,b.latitude FROM
  191. (SELECT id,g_id,tenant,concentrator,number,strategy FROM t_device_lampcontroller WHERE id IN (?) AND (ctl_type = 4 OR number >= 65500 )) a,
  192. (SELECT id,sunset,time_info,longitude,latitude FROM t_lamp_strategy) b
  193. WHERE a.strategy = b.id`
  194. err := G_db.Raw(sql, IDs).Scan(&zls).Error
  195. return zls, err
  196. }
  197. type Ym485LampStrategy struct {
  198. ID string
  199. GID string
  200. Tenant string
  201. Strategy string
  202. Sunset int
  203. TimeInfo string
  204. Longitude float64
  205. Latitude float64
  206. }
  207. //获取485灯控
  208. func GetYm485Lampstrategy(IDs []string) ([]Ym485LampStrategy, error) {
  209. var ls []Ym485LampStrategy
  210. var err error
  211. if len(IDs) == 0 { //获取日出日落
  212. sql := `SELECT a.id,a.g_id,a.tenant,a.strategy,b.sunset,b.time_info,b.longitude,b.latitude FROM
  213. (SELECT id,g_id,tenant,strategy FROM t_device_lampcontroller WHERE ctl_type = 2) a,
  214. (SELECT id,sunset,time_info,longitude,latitude FROM t_lamp_strategy WHERE sunset = 1) b
  215. WHERE a.strategy = b.id`
  216. err = G_db.Raw(sql).Scan(&ls).Error
  217. } else { //获取指定灯控
  218. sql := `SELECT a.id,a.g_id,a.tenant,a.strategy,b.sunset,b.time_info,b.longitude,b.latitude FROM
  219. (SELECT id,g_id,tenant,strategy FROM t_device_lampcontroller WHERE ctl_type = 2 AND id IN (?) ) a,
  220. (SELECT id,sunset,time_info,longitude,latitude FROM t_lamp_strategy) b
  221. WHERE a.strategy = b.id`
  222. err = G_db.Raw(sql, IDs).Scan(&ls).Error
  223. }
  224. return ls, err
  225. }