cabinet.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package service
  2. import (
  3. "dy-admin/internal/pcmserver/bus/cabinet_pkg"
  4. "dy-admin/internal/pcmserver/bus/model"
  5. "dy-admin/internal/pcmserver/bus/model/request"
  6. "dy-admin/internal/pcmserver/common"
  7. "dy-admin/internal/pcmserver/global"
  8. "dy-admin/internal/pcmserver/pkg/code"
  9. systemService "dy-admin/internal/pcmserver/sys/service"
  10. "dy-admin/pkg/log"
  11. "dy-admin/pkg/rescode"
  12. "fmt"
  13. "go.uber.org/zap"
  14. "gorm.io/gorm"
  15. )
  16. type CabinetService struct {
  17. }
  18. func (cs *CabinetService) initCabinets() {
  19. // 已经创建的手机柜,初始化到内存并
  20. var list []model.Cabinet
  21. err := global.DB.Order("Sort asc").Find(&list).Error
  22. if err != nil {
  23. panic(err)
  24. }
  25. cabIds := make([]int, 0, len(list))
  26. for _, cab := range list {
  27. cabIds = append(cabIds, cab.ID)
  28. channels := cabinetMapChannel.setCabinetChannel(cab.ID)
  29. cab.Connected = "断开"
  30. err = cabinet_pkg.AddCabinet(cab, channels.cabinetConnectChan, channels.gridStatusChan, channels.openStatusChan)
  31. if err != nil {
  32. panic(err)
  33. }
  34. log.Info("init cabinet to memory", zap.Int("cabinetId", cab.ID))
  35. }
  36. // 批量将连接重置为未连接
  37. err = global.DB.Model(&model.Cabinet{}).Where("id in (?)", cabIds).Update("connected", "断开").Error
  38. if err != nil {
  39. panic(err)
  40. }
  41. return
  42. }
  43. // CreateCabinet 增加柜子
  44. func (cs *CabinetService) CreateCabinet(cabinet model.Cabinet) (err error) {
  45. if cabinet.GridCount != 12 && cabinet.GridCount != 44 {
  46. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrCabinetGridCountCode])
  47. }
  48. var ipCount int64
  49. err = global.DB.Model(&model.Cabinet{}).Where("ip = ?", cabinet.Ip).Count(&ipCount).Error
  50. if err != nil {
  51. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  52. }
  53. if ipCount != 0 {
  54. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrIPAlreadyExistsCode])
  55. }
  56. var numCount int64
  57. err = global.DB.Model(&model.Cabinet{}).Where("number = ?", cabinet.Number).Count(&ipCount).Error
  58. if err != nil {
  59. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  60. }
  61. if numCount != 0 {
  62. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrNumberAlreadyExistsCode])
  63. }
  64. tx := global.DB.Begin()
  65. defer func() {
  66. if err != nil {
  67. tx.Rollback()
  68. } else {
  69. tx.Commit()
  70. }
  71. }()
  72. cabinet.Connected = "断开"
  73. cabinet.AllowOpen = "允许开启"
  74. err = tx.Create(&cabinet).Error
  75. if err != nil {
  76. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  77. }
  78. err = ServicesGroupApp.GridService.CreateGridBatch(cabinet.ID, cabinet.GridCount)
  79. if err != nil {
  80. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  81. }
  82. // 创建监听
  83. channels := cabinetMapChannel.setCabinetChannel(cabinet.ID)
  84. err = cabinet_pkg.AddCabinet(cabinet, channels.cabinetConnectChan, channels.gridStatusChan, channels.openStatusChan)
  85. if err != nil {
  86. return err
  87. }
  88. return
  89. }
  90. // UpdateCabinet 更新柜子
  91. func (cs *CabinetService) UpdateCabinet(cabinet model.Cabinet) (err error) {
  92. // ip 格子数量 创建后不允许修改。修改牵扯到的逻辑修改太多。
  93. err = global.DB.Updates(&cabinet).Error
  94. if err != nil {
  95. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  96. }
  97. info, err := cs.GetCabinet(cabinet.ID)
  98. if err != nil {
  99. return
  100. }
  101. fmt.Println(info)
  102. return
  103. }
  104. // DeleteCabinet 删除柜子
  105. func (cs *CabinetService) DeleteCabinet(cabinetId int) (err error) {
  106. // 找到柜子所有格子
  107. var girds []model.Grid
  108. err = global.DB.Where("cabinet_id = ?", cabinetId).Find(&girds).Error
  109. if err != nil {
  110. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  111. }
  112. var staffs []model.Staff
  113. err = global.DB.Where("cabinet_id = ?", cabinetId).Find(&staffs).Error
  114. if err != nil {
  115. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  116. }
  117. if len(staffs) != 0 {
  118. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrCabinetGridUsedCode])
  119. }
  120. // 找到所有占用格子的人员。置空
  121. deviceIds := make([]int, 0, len(girds))
  122. for _, grid := range girds {
  123. deviceIds = append(deviceIds, grid.DeviceGridID)
  124. }
  125. tx := global.DB.Begin()
  126. defer func() {
  127. if err != nil {
  128. tx.Rollback()
  129. } else {
  130. tx.Commit()
  131. }
  132. }()
  133. // 人员占用的格子,清空
  134. staff := model.Staff{CabinetID: 0, GridDeviceID: 0}
  135. err = tx.Model(&model.Staff{}).Where("cabinet_id = ?", cabinetId).Where("grid_device_id in (?)", deviceIds).
  136. Updates(&staff).Error
  137. if err != nil {
  138. return
  139. }
  140. // 删除格子
  141. err = tx.Model(&model.Grid{}).Delete(&girds).Error
  142. if err != nil {
  143. return
  144. }
  145. // 删除柜子
  146. err = tx.Delete(&model.Cabinet{Model: common.Model{ID: cabinetId}}).Error
  147. if err != nil {
  148. return
  149. }
  150. //删除内存中柜子
  151. err = cabinet_pkg.DelCabinet(cabinetId)
  152. if err != nil {
  153. return err
  154. }
  155. // 删除消息通道
  156. cabinetMapChannel.deleteCabinetChannel(cabinetId)
  157. return
  158. }
  159. // GetCabinetList 分页获取柜子
  160. func (cs *CabinetService) GetCabinetList(info request.CabinetSearch, dataPermission *BusPermission) (list []model.Cabinet, total int64, err error) {
  161. limit := info.PageSize
  162. offset := info.PageSize * (info.Page - 1)
  163. var cabinetModel model.Cabinet
  164. db := global.DB.Model(&cabinetModel).Scopes(Permission(cabinetModel.TableName(), dataPermission))
  165. if info.Name != "" {
  166. db = db.Where("name LIKE ?", "%"+info.Name+"%")
  167. }
  168. if info.DeptID != 0 {
  169. deptIds, err := systemService.ServicesGroupApp.DeptService.GetSonDeptIds(info.DeptID)
  170. if err != nil {
  171. log.Warn("get son deptIds err", zap.Error(err))
  172. } else {
  173. db = db.Where("department_id in (?)", deptIds)
  174. }
  175. }
  176. err = db.Count(&total).Error
  177. if err != nil {
  178. return
  179. }
  180. if err = db.Order("sort asc").Limit(limit).Offset(offset).Find(&list).Error; err != nil {
  181. return list, total, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  182. }
  183. return
  184. }
  185. // GetCabinet 获取单个柜子
  186. func (cs *CabinetService) GetCabinet(cabinetId int) (*model.Cabinet, error) {
  187. var cabinet model.Cabinet
  188. err := global.DB.Where("id = ?", cabinetId).First(&cabinet).Error
  189. if err != nil && err != gorm.ErrRecordNotFound {
  190. return &cabinet, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  191. }
  192. return &cabinet, nil
  193. }
  194. func (cs *CabinetService) ChangeCabinetStatus(cabinetId int, status string) (err error) {
  195. tx := global.DB.Begin()
  196. defer func() {
  197. if err != nil {
  198. tx.Rollback()
  199. } else {
  200. tx.Commit()
  201. }
  202. }()
  203. updateCabinet := model.Cabinet{AllowOpen: status}
  204. err = tx.Where("id = ?", cabinetId).Updates(&updateCabinet).Error
  205. if err != nil {
  206. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  207. }
  208. if status == "允许开启" {
  209. err = cabinet_pkg.EnableOpenDoor(cabinetId, true)
  210. if err != nil {
  211. return err
  212. }
  213. } else {
  214. err = cabinet_pkg.DisableOpenDoor(cabinetId)
  215. if err != nil {
  216. return err
  217. }
  218. }
  219. //推送到首页
  220. go func() {
  221. memInfo := cabinet_pkg.GetCabinet(cabinetId)
  222. err = sendUpdateCabinetOpenStatus(memInfo.DeptID, cabinetId, status, true)
  223. if err != nil {
  224. log.Error("sendUpdateCabinetOpenStatus", zap.Error(err))
  225. }
  226. }()
  227. return
  228. }
  229. func (cs *CabinetService) ChangeCabinetConnectStatus(cabinetId int, connectStatus string) (err error) {
  230. updateCabinet := model.Cabinet{Connected: connectStatus}
  231. err = global.DB.Where("id = ?", cabinetId).Updates(&updateCabinet).Error
  232. if err != nil {
  233. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  234. }
  235. // 推送到首页
  236. go func() {
  237. memInfo := cabinet_pkg.GetCabinet(cabinetId)
  238. // 连接状态推送
  239. err = sendUpdateCabinetConnect(memInfo.DeptID, memInfo.CabinetID, connectStatus, true)
  240. if err != nil {
  241. log.Error("sendUpdateCabinetConnect", zap.Error(err))
  242. }
  243. // 部门下的柜子连接数推送
  244. err = sendCabinetConnect(memInfo.DeptID, true, nil)
  245. if err != nil {
  246. log.Error("sendCabinetConnect", zap.Error(err))
  247. }
  248. }()
  249. return
  250. }
  251. func (cs *CabinetService) GetCabinetWithGrids(cabinetId int) (cabinet *model.Cabinet, grids []model.Grid, err error) {
  252. cabinet, err = cs.GetCabinet(cabinetId)
  253. if err != nil {
  254. return cabinet, grids, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  255. }
  256. grids, err = ServicesGroupApp.GridService.GetGridListByCabinetID(cabinetId)
  257. if err != nil {
  258. return cabinet, grids, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  259. }
  260. return
  261. }
  262. func (cs *CabinetService) GetCabinetsByDeptID(deptId int) (cabinets []model.Cabinet, err error) {
  263. err = global.DB.Model(&model.Cabinet{}).Where("department_id = ?", deptId).Find(&cabinets).Order("sort asc").Error
  264. if err != nil && err != gorm.ErrRecordNotFound {
  265. return cabinets, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  266. }
  267. return
  268. }
  269. func (cs *CabinetService) GetCabinetIDsByDeptID(deptId int) (ids []int, err error) {
  270. var cabinets []model.Cabinet
  271. err = global.DB.Model(&model.Cabinet{}).Where("department_id = ?", deptId).Find(&cabinets).Order("sort asc").Error
  272. if err != nil && err != gorm.ErrRecordNotFound {
  273. return ids, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  274. }
  275. for _, cabinet := range cabinets {
  276. ids = append(ids, cabinet.ID)
  277. }
  278. return
  279. }
  280. func (cs *CabinetService) GetCabinetConnectByDeptID(deptId int) (connect int64, noConnect int64, err error) {
  281. err = global.DB.Model(&model.Cabinet{}).Where("department_id = ?", deptId).Where("connected = ?", "连接").Count(&connect).Error
  282. if err != nil {
  283. return connect, noConnect, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  284. }
  285. err = global.DB.Model(&model.Cabinet{}).Where("department_id = ?", deptId).Where("connected = ?", "断开").Count(&noConnect).Error
  286. if err != nil {
  287. return connect, noConnect, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  288. }
  289. return
  290. }