seat.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package dao
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "time"
  7. "go-common/app/service/openplatform/ticket-item/model"
  8. "go-common/library/ecode"
  9. "go-common/library/log"
  10. "github.com/jinzhu/gorm"
  11. )
  12. // 管理area_seats、area_seatmap、seat_set、seat_order座位相关表
  13. // area_seats为区域座位表,每个座位一行
  14. // area_seatmap为区域座位图表,每个区域一行,与area_seats对应
  15. // seat_order为场次的座位订单表,每个座位一行,创建场次座位图时生成
  16. // seat_set为场次的座位设置图表,每个区域一行,基于area_seatmap生成,针对场次含有不同的票价标记
  17. const (
  18. // StatusCansale 可售
  19. StatusCansale = 0
  20. // StatusIssue 已出票
  21. StatusIssue = 2
  22. // StatusLocked 已锁定
  23. StatusLocked = 3
  24. // StatusBooked 已预订
  25. StatusBooked = 4
  26. )
  27. // TxUpdateSeat 编辑区域座位信息(事务)
  28. func (d *Dao) TxUpdateSeat(c context.Context, tx *gorm.DB, area *model.Area) (err error) {
  29. if err = tx.Table("area").Where("id = ?", area.ID).Updates(
  30. map[string]interface{}{
  31. "seats_num": area.SeatsNum,
  32. "width": area.Width,
  33. "height": area.Height,
  34. "deleted_status": area.DeletedStatus,
  35. "col_start": area.ColStart,
  36. "col_type": area.ColType,
  37. "col_direction": area.ColDirection,
  38. "row_list": area.RowList,
  39. "seat_start": area.SeatStart,
  40. }).Error; err != nil {
  41. log.Error("更新区域座位信息(ID:%d)失败:%s", area.ID, err)
  42. err = ecode.NotModified
  43. return
  44. }
  45. return
  46. }
  47. // TxGetAreaSeats 批量获取区域对应的区域座位信息(事务)
  48. func (d *Dao) TxGetAreaSeats(c context.Context, tx *gorm.DB, area int64) (areaSeats []*model.AreaSeats, err error) {
  49. if err = tx.Find(&areaSeats, "area = ?", area).Error; err != nil {
  50. log.Error("批量获取区域座位信息(area:%d)失败:%s", area, err)
  51. return
  52. }
  53. return
  54. }
  55. // TxBatchAddAreaSeats 批量添加区域座位信息(事务)
  56. func (d *Dao) TxBatchAddAreaSeats(c context.Context, tx *gorm.DB, areaSeats []*model.AreaSeats) (err error) {
  57. if len(areaSeats) == 0 {
  58. return
  59. }
  60. var values = make([]string, len(areaSeats))
  61. for i, areaSeat := range areaSeats {
  62. values[i] = fmt.Sprintf("(%d,%d,'%s','%s',%d,%d)", areaSeat.X, areaSeat.Y, areaSeat.Label, areaSeat.Bgcolor, areaSeat.Area, 0)
  63. }
  64. var sql = fmt.Sprintf("INSERT INTO `area_seats` (`x`, `y`, `label`, `bgcolor`, `area`, `dstatus`) VALUES %s;", strings.Join(values, ","))
  65. if err = tx.Exec(sql).Error; err != nil {
  66. log.Error("批量添加区域座位信息(%s)失败:%s", sql, err)
  67. err = ecode.NotModified
  68. return
  69. }
  70. return
  71. }
  72. // TxBatchDeleteAreaSeats 软删除区域对应的区域座位表信息
  73. func (d *Dao) TxBatchDeleteAreaSeats(c context.Context, tx *gorm.DB, area int64) (err error) {
  74. if err = tx.Table("area_seats").Where("area = ?", area).Updates(
  75. map[string]interface{}{
  76. "dstatus": 1,
  77. }).Error; err != nil {
  78. log.Error("删除区域座位信息(area:%d)失败:%s", area, err)
  79. err = ecode.NotModified
  80. return
  81. }
  82. return
  83. }
  84. // TxBatchRecoverAreaSeats 恢复软删除的区域座位表信息
  85. func (d *Dao) TxBatchRecoverAreaSeats(c context.Context, tx *gorm.DB, ids []int64) (err error) {
  86. if err = tx.Table("area_seats").Where("id in (?)", ids).Updates(
  87. map[string]interface{}{
  88. "dstatus": 0,
  89. }).Error; err != nil {
  90. log.Error("批量恢复区域座位信息失败:%s", err)
  91. err = ecode.NotModified
  92. return
  93. }
  94. return
  95. }
  96. // TxRawAreaSeatmap 获取区域座位图信息(事务)
  97. func (d *Dao) TxRawAreaSeatmap(c context.Context, tx *gorm.DB, id int64) (areaSeatmap *model.AreaSeatmap, err error) {
  98. areaSeatmap = new(model.AreaSeatmap)
  99. if err = tx.First(&areaSeatmap, id).Error; err != nil {
  100. log.Error("获取区域座位信息(ID:%d)失败:%s", id, err)
  101. return
  102. }
  103. return
  104. }
  105. // TxSaveAreaSeatmap 添加/修改区域座位图信息(事务)
  106. func (d *Dao) TxSaveAreaSeatmap(c context.Context, tx *gorm.DB, areaSeatmap *model.AreaSeatmap) (err error) {
  107. if res := tx.Save(areaSeatmap); res.Error != nil {
  108. log.Error("添加区域座位信息失败:%s", res.Error)
  109. err = ecode.NotModified
  110. return
  111. }
  112. return
  113. }
  114. // TxGetSeatChart 根据场次ID和区域ID查询ID和票价设置图(事务)
  115. func (d *Dao) TxGetSeatChart(c context.Context, tx *gorm.DB, screen int64, area int64) (seatSet *model.SeatSet, err error) {
  116. seatSet = new(model.SeatSet)
  117. if res := tx.Select("id, seat_chart").Where("screen_id = ? AND area_id = ? AND deleted_at = 0", screen, area).First(seatSet); res.Error != nil {
  118. if res.RecordNotFound() {
  119. return
  120. }
  121. err = res.Error
  122. log.Error("TxGetSeatChart error(%v)", err)
  123. }
  124. return
  125. }
  126. // TxGetSeatCharts 根据场次ID和多个区域ID批量查询多个票价设置ID和票价设置图(事务)
  127. func (d *Dao) TxGetSeatCharts(c context.Context, tx *gorm.DB, screen int64, areas []int64) (seatSets []*model.SeatSet, err error) {
  128. if err = tx.Select("id, seat_chart").Where("screen_id = ? AND area_id in (?) AND deleted_at = 0", screen, areas).Find(&seatSets).Error; err != nil {
  129. log.Error("TxGetSeatCharts error(%v)", err)
  130. }
  131. return
  132. }
  133. // TxGetSeatSets 根据区域ID批量查询多个票价设置ID和场次ID(事务)
  134. func (d *Dao) TxGetSeatSets(c context.Context, tx *gorm.DB, area int64) (seatSets []*model.SeatSet, err error) {
  135. if err = tx.Select("id, screen_id").Where("area_id = ? AND deleted_at = 0", area).Find(&seatSets).Error; err != nil {
  136. log.Error("TxGetSeatSets error(%v)", err)
  137. }
  138. return
  139. }
  140. // TxAddSeatChart 添加票价设置图(事务)
  141. func (d *Dao) TxAddSeatChart(c context.Context, tx *gorm.DB, seatSet *model.SeatSet) (err error) {
  142. if res := tx.Create(seatSet); res.Error != nil {
  143. log.Error("添加票价设置图失败:%s", res.Error)
  144. err = ecode.NotModified
  145. return
  146. }
  147. return
  148. }
  149. // TxUpdateSeatChart 更新票价设置图(事务)
  150. func (d *Dao) TxUpdateSeatChart(c context.Context, tx *gorm.DB, id int64, seatChart string) (err error) {
  151. if err = tx.Table("seat_set").Where("id = ? AND deleted_at = 0", id).Updates(
  152. map[string]interface{}{
  153. "seat_chart": seatChart,
  154. }).Error; err != nil {
  155. log.Error("更新票价设置图(ID:%d)失败:%s", id, err)
  156. }
  157. return
  158. }
  159. // TxClearSeatCharts 清空票价设置图(事务)
  160. func (d *Dao) TxClearSeatCharts(c context.Context, tx *gorm.DB, ids []int64) (err error) {
  161. if err = tx.Table("seat_set").Where("id IN (?) AND deleted_at = 0", ids).Updates(
  162. map[string]interface{}{
  163. "seat_chart": "",
  164. }).Error; err != nil {
  165. log.Error("清空票价设置图失败:%s", err)
  166. }
  167. return
  168. }
  169. // TxGetUnsaleableSeatOrders 根据场次和区域ID查询不可售座位订单信息(事务)
  170. func (d *Dao) TxGetUnsaleableSeatOrders(c context.Context, tx *gorm.DB, screen int64, area int64) (seatOrders []*model.SeatOrder, err error) {
  171. if err = tx.Unscoped().Where("screen_id = ? AND area_id = ? AND status in (?) AND deleted_at = 0", screen, area, []int32{StatusIssue, StatusLocked, StatusBooked}).Find(&seatOrders).Error; err != nil {
  172. log.Error("TxGetUnsaleableSeatOrders error(%v)", err)
  173. }
  174. return
  175. }
  176. // TxGetSaleableSeatOrders 根据场次ID和票价ID查询可售座位订单ID和区域ID信息(事务)
  177. func (d *Dao) TxGetSaleableSeatOrders(c context.Context, tx *gorm.DB, screen int64, price int64) (seatOrders []*model.SeatOrder, err error) {
  178. if err = tx.Select("id, area_id").Unscoped().Where("screen_id = ? AND price_id = ? AND status = ? AND deleted_at = 0", screen, price, StatusCansale).Find(&seatOrders).Error; err != nil {
  179. log.Error("TxGetSaleableSeatOrders error(%v)", err)
  180. }
  181. return
  182. }
  183. // TxBatchDelUnsoldSeatOrders 根据区域ID清空未售出的座位订单(事务)
  184. func (d *Dao) TxBatchDelUnsoldSeatOrders(c context.Context, tx *gorm.DB, area int64) (err error) {
  185. if err = tx.Table("seat_order").Where("area_id = ? AND status IN (?) AND deleted_at = 0", area, []int32{StatusCansale, StatusLocked}).Updates(
  186. map[string]interface{}{
  187. "deleted_at": time.Now(),
  188. }).Error; err != nil {
  189. log.Error("批量删除座位订单信息失败:%s", err)
  190. err = ecode.NotModified
  191. return
  192. }
  193. return
  194. }
  195. // TxAddSeatOrder 添加座位订单信息(事务,暂未使用)
  196. func (d *Dao) TxAddSeatOrder(c context.Context, tx *gorm.DB, seatOrder *model.SeatOrder) (err error) {
  197. if res := tx.Create(seatOrder); res.Error != nil {
  198. log.Error("添加座位订单信息失败:%s", res.Error)
  199. err = ecode.NotModified
  200. return
  201. }
  202. return
  203. }
  204. // TxUpdateSeatOrder 编辑座位订单信息(事务,暂未使用)
  205. // TODO: 具体字段未指定
  206. func (d *Dao) TxUpdateSeatOrder(c context.Context, tx *gorm.DB, seatOrder *model.SeatOrder) (err error) {
  207. if err = tx.Table("seat_order").Where("id = ? AND deleted_at = 0", seatOrder.ID).Updates(
  208. map[string]interface{}{}).Error; err != nil {
  209. log.Error("更新座位订单信息(ID:%d)失败:%s", seatOrder.ID, err)
  210. err = ecode.NotModified
  211. return
  212. }
  213. return
  214. }
  215. // TxBatchDeleteSeatOrder 批量软删除座位订单信息(事务)
  216. func (d *Dao) TxBatchDeleteSeatOrder(c context.Context, tx *gorm.DB, ids []int64) (err error) {
  217. if err = tx.Table("seat_order").Where("id in (?)", ids).Updates(
  218. map[string]interface{}{
  219. "deleted_at": time.Now(),
  220. }).Error; err != nil {
  221. log.Error("批量删除座位订单信息失败:%s", err)
  222. err = ecode.NotModified
  223. return
  224. }
  225. return
  226. }
  227. // TxBatchAddSeatOrder 批量添加座位订单(事务)
  228. func (d *Dao) TxBatchAddSeatOrder(c context.Context, tx *gorm.DB, seatOrders []*model.SeatOrder) (err error) {
  229. if len(seatOrders) == 0 {
  230. return
  231. }
  232. var values = make([]string, len(seatOrders))
  233. for i, so := range seatOrders {
  234. values[i] = fmt.Sprintf("(%d,%d,%d,%d,%d,%d)", so.AreaID, so.ScreenID, so.Row, so.Col, so.PriceID, so.Price)
  235. }
  236. var sql = fmt.Sprintf("INSERT INTO `seat_order` (`area_id`, `screen_id`, `row`, `col`, `price_id`, `price`) VALUES %s;", strings.Join(values, ","))
  237. if err = tx.Exec(sql).Error; err != nil {
  238. log.Error("批量添加区域座位信息(%s)失败:%s", sql, err)
  239. err = ecode.NotModified
  240. return
  241. }
  242. return
  243. }