grid.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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/common"
  6. "dy-admin/internal/pcmserver/global"
  7. "dy-admin/internal/pcmserver/pkg/code"
  8. "dy-admin/pkg/log"
  9. "dy-admin/pkg/rescode"
  10. "github.com/pkg/errors"
  11. "go.uber.org/zap"
  12. "gorm.io/gorm"
  13. )
  14. type GridService struct {
  15. }
  16. // CreateGridBatch 创建格子(内部使用)
  17. func (gs *GridService) CreateGridBatch(cabinetId int, gridCount int) (err error) {
  18. grids := make([]model.Grid, 0, gridCount)
  19. for i := 1; i <= gridCount; i++ {
  20. grid := model.Grid{
  21. CabinetID: cabinetId,
  22. DeviceGridID: i,
  23. ColorStatus: "灰色",
  24. GridInfo: "未启用",
  25. }
  26. grids = append(grids, grid)
  27. }
  28. err = global.DB.CreateInBatches(grids, gridCount).Error
  29. if err != nil {
  30. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  31. }
  32. return
  33. }
  34. // UpdateGrid 更新格子状态(内部使用)
  35. func (gs *GridService) UpdateGrid(grid model.Grid) (err error) {
  36. err = global.DB.Updates(&grid).Error
  37. if err != nil {
  38. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  39. }
  40. // 推送格子
  41. go func() {
  42. memInfo := cabinet_pkg.GetCabinet(grid.CabinetID)
  43. err = sendUpdateGrid(memInfo.DeptID, grid.CabinetID, grid.DeviceGridID, true)
  44. if err != nil {
  45. log.Error("sendUpdateCabinetOpenStatus", zap.Error(err))
  46. }
  47. err = sendDeptStoneInfo(memInfo.DeptID, true, nil)
  48. if err != nil {
  49. log.Error("sendDeptStoneInfo", zap.Error(err))
  50. }
  51. }()
  52. return
  53. }
  54. // UpdateByCabinetIDAndGridID 通过柜子id和格子id更新格子状态(内部使用)
  55. func (gs *GridService) UpdateByCabinetIDAndGridID(grid model.Grid) (err error) {
  56. err = global.DB.Where("cabinet_id = ?", grid.CabinetID).Where("device_grid_id = ?", grid.DeviceGridID).Updates(&grid).Error
  57. if err != nil {
  58. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  59. }
  60. // 推送格子
  61. go func() {
  62. memInfo := cabinet_pkg.GetCabinet(grid.CabinetID)
  63. err = sendUpdateGrid(memInfo.DeptID, grid.CabinetID, grid.DeviceGridID, true)
  64. if err != nil {
  65. log.Error("sendUpdateCabinetOpenStatus", zap.Error(err))
  66. }
  67. }()
  68. return
  69. }
  70. // GetGridByID 获取单个格子(内部使用)
  71. func (gs *GridService) GetGridByID(id int) (gird model.Grid, err error) {
  72. err = global.DB.Where("id = ?", id).First(&gird).Error
  73. if err != nil {
  74. if errors.Is(err, gorm.ErrRecordNotFound) {
  75. return gird, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrGridNotFoundCode])
  76. }
  77. return gird, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  78. }
  79. return
  80. }
  81. // GetGridByCabinetIDAndGridID 根据柜子id和格子id获取单个格子(内部使用)
  82. func (gs *GridService) GetGridByCabinetIDAndGridID(cabinetId, gridDeviceId int) (gird model.Grid, err error) {
  83. err = global.DB.Where("cabinet_id = ?", cabinetId).Where("device_grid_id = ?", gridDeviceId).First(&gird).Error
  84. if err != nil {
  85. return gird, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  86. }
  87. return
  88. }
  89. // GetGridListByCabinetID 通过柜子id获取全部格子
  90. func (gs *GridService) GetGridListByCabinetID(cabinetId int) (grids []model.Grid, err error) {
  91. err = global.DB.Where("cabinet_id = ?", cabinetId).Find(&grids).Error
  92. if err != nil {
  93. return grids, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  94. }
  95. return
  96. }
  97. // OpenGrid 开关门操作
  98. func (gs *GridService) OpenGrid(gridId int) (err error) {
  99. gridInfo, err := gs.GetGridByID(gridId)
  100. if err != nil {
  101. return err
  102. }
  103. tx := global.DB.Begin()
  104. defer func() {
  105. if err != nil {
  106. tx.Rollback()
  107. } else {
  108. tx.Commit()
  109. }
  110. }()
  111. // 下发指令
  112. err = cabinet_pkg.OpenDoor(gridInfo.CabinetID, uint16(gridInfo.DeviceGridID))
  113. if err != nil {
  114. return err
  115. }
  116. if gridInfo.Staff.ID == 0 {
  117. return
  118. }
  119. // 平台可以在任何时候开门
  120. updateGrid := model.Grid{
  121. Model: common.Model{ID: gridId},
  122. OpenState: model.GridOpenState,
  123. }
  124. err = tx.Model(&updateGrid).Updates(&updateGrid).Error
  125. if err != nil {
  126. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  127. }
  128. // 推送格子状态
  129. go func() {
  130. memInfo := cabinet_pkg.GetCabinet(gridInfo.CabinetID)
  131. err = sendUpdateGrid(memInfo.DeptID, gridInfo.CabinetID, gridInfo.DeviceGridID, true)
  132. if err != nil {
  133. log.Error("sendUpdateCabinetOpenStatus", zap.Error(err))
  134. }
  135. }()
  136. return
  137. }
  138. func (gs *GridService) GetGridUseInfo(cabinetIds []int) (use int64, noUse int64, err error) {
  139. err = global.DB.Model(&model.Grid{}).Where("cabinet_id in (?)", cabinetIds).Where("stone_state = ?", "未存物").Count(&noUse).Error
  140. if err != nil {
  141. return use, noUse, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  142. }
  143. err = global.DB.Model(&model.Grid{}).Where("cabinet_id in (?)", cabinetIds).Where("stone_state = ?", "存物").Count(&use).Error
  144. if err != nil {
  145. return use, noUse, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  146. }
  147. return use, noUse, nil
  148. }
  149. // 推送格子状态