grid.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. err = sendDeptStoneInfo(memInfo.DeptID, true, nil)
  68. if err != nil {
  69. log.Error("sendDeptStoneInfo", zap.Error(err))
  70. }
  71. }()
  72. return
  73. }
  74. // GetGridByID 获取单个格子(内部使用)
  75. func (gs *GridService) GetGridByID(id int) (gird model.Grid, err error) {
  76. err = global.DB.Where("id = ?", id).First(&gird).Error
  77. if err != nil {
  78. if errors.Is(err, gorm.ErrRecordNotFound) {
  79. return gird, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrGridNotFoundCode])
  80. }
  81. return gird, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  82. }
  83. return
  84. }
  85. // GetGridByCabinetIDAndGridID 根据柜子id和格子id获取单个格子(内部使用)
  86. func (gs *GridService) GetGridByCabinetIDAndGridID(cabinetId, gridDeviceId int) (gird model.Grid, err error) {
  87. err = global.DB.Where("cabinet_id = ?", cabinetId).Where("device_grid_id = ?", gridDeviceId).First(&gird).Error
  88. if err != nil {
  89. return gird, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  90. }
  91. return
  92. }
  93. // GetGridListByCabinetID 通过柜子id获取全部格子
  94. func (gs *GridService) GetGridListByCabinetID(cabinetId int) (grids []model.Grid, err error) {
  95. err = global.DB.Where("cabinet_id = ?", cabinetId).Find(&grids).Error
  96. if err != nil {
  97. return grids, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  98. }
  99. return
  100. }
  101. // OpenGrid 开关门操作
  102. func (gs *GridService) OpenGrid(gridId int) (err error) {
  103. gridInfo, err := gs.GetGridByID(gridId)
  104. if err != nil {
  105. return err
  106. }
  107. tx := global.DB.Begin()
  108. defer func() {
  109. if err != nil {
  110. tx.Rollback()
  111. } else {
  112. tx.Commit()
  113. }
  114. }()
  115. // 下发指令
  116. err = cabinet_pkg.OpenDoor(gridInfo.CabinetID, uint16(gridInfo.DeviceGridID))
  117. if err != nil {
  118. return err
  119. }
  120. if gridInfo.Staff.ID == 0 {
  121. return
  122. }
  123. // 平台可以在任何时候开门
  124. updateGrid := model.Grid{
  125. Model: common.Model{ID: gridId},
  126. OpenState: model.GridOpenState,
  127. }
  128. err = tx.Model(&updateGrid).Updates(&updateGrid).Error
  129. if err != nil {
  130. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  131. }
  132. // 推送格子状态
  133. go func() {
  134. memInfo := cabinet_pkg.GetCabinet(gridInfo.CabinetID)
  135. err = sendUpdateGrid(memInfo.DeptID, gridInfo.CabinetID, gridInfo.DeviceGridID, true)
  136. if err != nil {
  137. log.Error("sendUpdateCabinetOpenStatus", zap.Error(err))
  138. }
  139. }()
  140. return
  141. }
  142. func (gs *GridService) GetGridUseInfo(cabinetIds []int) (use int64, noUse int64, err error) {
  143. err = global.DB.Model(&model.Grid{}).Where("cabinet_id in (?)", cabinetIds).Where("grid_info in ?", []string{"未存入", "非正常取出", "已取出"}).Where("stone_state = ?", "未存物").Count(&noUse).Error
  144. if err != nil {
  145. return use, noUse, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  146. }
  147. err = global.DB.Model(&model.Grid{}).Where("cabinet_id in (?)", cabinetIds).Where("grid_info in ?", []string{model.GridNoRecharge, model.GridRecharging, model.GridRechargeFull}).Where("stone_state = ?", "存物").Count(&use).Error
  148. if err != nil {
  149. return use, noUse, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  150. }
  151. return use, noUse, nil
  152. }
  153. // 推送格子状态