msg_repo.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package repository
  2. import (
  3. "fmt"
  4. "time"
  5. "xorm.io/xorm"
  6. "xps/pkg/base"
  7. "xps/pkg/system/datamodel"
  8. "xps/pkg/system/viewmodel"
  9. )
  10. type MsgRepo struct {
  11. engine *xorm.Engine
  12. }
  13. func NewMsgRepo(engine *xorm.Engine) *MsgRepo {
  14. return &MsgRepo{
  15. engine: engine,
  16. }
  17. }
  18. func (d *MsgRepo) GetPage(m map[string]interface{}) (*base.PageResult, error) {
  19. limit := m["limit"].(int)
  20. page := m["page"].(int)
  21. sqlSelect := ` SELECT M.oc_id,
  22. M.msg_id,
  23. M.msg_fr_id,
  24. A.account_name AS msg_fr_name,
  25. A.account_real_name AS msg_fr_real_name,
  26. A.account_avatar AS msg_fr_avatar,
  27. M.msg_to_group,
  28. M.msg_cc,
  29. M.msg_to,
  30. M.msg_content,
  31. M.msg_detail,
  32. M.msg_cat_id,
  33. MC.msg_cat_title,
  34. MC.is_link,
  35. MC.msg_cat_link,
  36. MC.msg_cat_link_params,
  37. M.msg_params,
  38. MC.is_detailed,
  39. M.status,
  40. M.msg_time `
  41. sqlFrom := ` FROM msg AS M
  42. LEFT JOIN account AS A ON (M.oc_id = A.oc_id AND M.msg_fr_id = A.account_id)
  43. LEFT JOIN msg_to AS B ON (M.oc_id = B.oc_id AND M.msg_id = B.msg_id AND B.msg_to_id=#{msgToCc, jdbcType=BIGINT})
  44. LEFT JOIN msg_cc AS C ON (M.oc_id = C.oc_id AND M.msg_id = C.msg_id AND C.msg_cc_id=#{msgToCc, jdbcType=BIGINT})
  45. LEFT JOIN msg_cat AS MC ON (MC.msg_cat_id = M.msg_cat_id) `
  46. sqlWhere := ` WHERE A.deleted_flag = 0 `
  47. if ocId, ok := m["ocId"]; ok {
  48. sqlWhere += fmt.Sprintf(" AND M.oc_id = %d", ocId)
  49. }
  50. if msgFrId, ok := m["msgFrId"]; ok {
  51. sqlWhere += fmt.Sprintf(" AND M.msg_fr_id = %d ", msgFrId)
  52. }
  53. if msgToCc, ok := m["msgToCc"]; ok {
  54. sqlWhere += `
  55. AND (
  56. EXISTS (
  57. SELECT 1 FROM msg_to TT
  58. WHERE M.oc_id = TT.oc_id AND M.msg_id = TT.msg_id AND TT.msg_to_id = ` + fmt.Sprintf("%d", msgToCc)
  59. sqlWhere += `
  60. ) OR
  61. EXISTS (
  62. SELECT 1 FROM msg_cc CC
  63. WHERE M.oc_id = CC.oc_id AND M.msg_id = CC.msg_id AND CC.msg_cc_id = ` + fmt.Sprintf("%d", msgToCc)
  64. sqlWhere += `
  65. )
  66. ) `
  67. }
  68. sqlCount := ` SELECT COUNT(*) `
  69. total, err1 := d.engine.SQL(sqlCount + sqlFrom + sqlWhere).Count(new(datamodel.Msg))
  70. if err1 != nil {
  71. return nil, err1
  72. }
  73. sqlOrderBy := " BY M.created_at DESC "
  74. pageStart := (page - 1) * limit
  75. sqlLimit := fmt.Sprintf(" LIMIT %d OFFSET %d ", limit, pageStart)
  76. datalist := make([]datamodel.Msg, 0)
  77. err2 := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy + sqlLimit).Find(&datalist)
  78. if err2 != nil {
  79. return nil, err2
  80. }
  81. pageResult := &base.PageResult{}
  82. pageResult.Data = datalist
  83. pageResult.Total = total
  84. pageResult.PageSize = limit
  85. pageResult.Page = page
  86. return pageResult, nil
  87. }
  88. func (d *MsgRepo) GetList(m map[string]interface{}) ([]viewmodel.MsgInfo, error) {
  89. sqlSelect := ` SELECT M.oc_id,
  90. M.msg_id,
  91. M.msg_fr_id,
  92. A.account_name AS msg_fr_name,
  93. A.account_real_name AS msg_fr_real_name,
  94. A.account_avatar AS msg_fr_avatar,
  95. M.msg_to_group,
  96. M.msg_cc,
  97. M.msg_to,
  98. M.msg_content,
  99. M.msg_detail,
  100. M.msg_cat_id,
  101. MC.msg_cat_title,
  102. MC.is_link,
  103. MC.msg_cat_link,
  104. MC.msg_cat_link_params,
  105. M.msg_params,
  106. MC.is_detailed,
  107. M.status,
  108. M.msg_time `
  109. sqlFrom := ` FROM msg AS M
  110. LEFT JOIN account AS A ON (M.oc_id = A.oc_id AND M.msg_fr_id = A.account_id)
  111. LEFT JOIN msg_to AS B ON (M.oc_id = B.oc_id AND M.msg_id = B.msg_id AND B.msg_to_id=#{msgToCc, jdbcType=BIGINT})
  112. LEFT JOIN msg_cc AS C ON (M.oc_id = C.oc_id AND M.msg_id = C.msg_id AND C.msg_cc_id=#{msgToCc, jdbcType=BIGINT})
  113. LEFT JOIN msg_cat AS MC ON (MC.msg_cat_id = M.msg_cat_id) `
  114. sqlWhere := ` WHERE A.deleted_flag = 0 `
  115. if ocId, ok := m["ocId"]; ok {
  116. sqlWhere += fmt.Sprintf(" AND M.oc_id = %d", ocId)
  117. }
  118. if msgFrId, ok := m["msgFrId"]; ok {
  119. sqlWhere += fmt.Sprintf(" AND M.msg_fr_id = %d ", msgFrId)
  120. }
  121. if msgToCc, ok := m["msgToCc"]; ok {
  122. sqlWhere += `
  123. AND (
  124. EXISTS (
  125. SELECT 1 FROM msg_to TT
  126. WHERE M.oc_id = TT.oc_id AND M.msg_id = TT.msg_id AND TT.msg_to_id = ` + fmt.Sprintf("%d", msgToCc)
  127. sqlWhere += `
  128. ) OR
  129. EXISTS (
  130. SELECT 1 FROM msg_cc CC
  131. WHERE M.oc_id = CC.oc_id AND M.msg_id = CC.msg_id AND CC.msg_cc_id = ` + fmt.Sprintf("%d", msgToCc)
  132. sqlWhere += `
  133. )
  134. ) `
  135. }
  136. sqlOrderBy := " ORDER BY M.created_at DESC "
  137. datalist := make([]viewmodel.MsgInfo, 0)
  138. err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy).Find(&datalist)
  139. if err != nil {
  140. return nil, err
  141. } else {
  142. return datalist, nil
  143. }
  144. }
  145. func (d *MsgRepo) GetById(ocId, msgId int64) (*viewmodel.MsgInfo, error) {
  146. sqlSelect := ` SELECT M.oc_id,
  147. M.msg_id,
  148. M.msg_fr_id,
  149. A.account_name AS msg_fr_name,
  150. A.account_real_name AS msg_fr_real_name,
  151. A.account_avatar AS msg_fr_avatar,
  152. M.msg_to_group,
  153. M.msg_cc,
  154. M.msg_to,
  155. M.msg_content,
  156. M.msg_detail,
  157. M.msg_cat_id,
  158. MC.msg_cat_title,
  159. MC.is_link,
  160. MC.msg_cat_link,
  161. MC.msg_cat_link_params,
  162. M.msg_params,
  163. MC.is_detailed,
  164. M.status,
  165. M.msg_time `
  166. sqlFrom := ` FROM msg AS M
  167. LEFT JOIN account AS A ON (M.oc_id = A.oc_id AND M.msg_fr_id = A.account_id)
  168. LEFT JOIN msg_to AS B ON (M.oc_id = B.oc_id AND M.msg_id = B.msg_id AND B.msg_to_id=#{msgToCc, jdbcType=BIGINT})
  169. LEFT JOIN msg_cc AS C ON (M.oc_id = C.oc_id AND M.msg_id = C.msg_id AND C.msg_cc_id=#{msgToCc, jdbcType=BIGINT})
  170. LEFT JOIN msg_cat AS MC ON (MC.msg_cat_id = M.msg_cat_id) `
  171. sqlWhere := ` WHERE A.deleted_flag = 0 `
  172. sqlWhere += fmt.Sprintf(" AND A.oc_id = %d ", ocId)
  173. sqlWhere += fmt.Sprintf(" AND A.msg_id = %d ", msgId)
  174. data := &viewmodel.MsgInfo{}
  175. has, err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere).Get(data)
  176. if !has || err != nil {
  177. return nil, err
  178. } else {
  179. return data, nil
  180. }
  181. }
  182. func (d *MsgRepo) Create(data *datamodel.Msg) error {
  183. data.CreatedAt = time.Now()
  184. _, err := d.engine.Insert(data)
  185. return err
  186. }
  187. func (d *MsgRepo) Update(data *datamodel.Msg) error {
  188. msgCatId := data.MsgId
  189. data.UpdatedAt = time.Now()
  190. _, err := d.engine.Where("msg_cat_id = ?", msgCatId).Update(data)
  191. return err
  192. }
  193. func (d *MsgRepo) Delete(m map[string]interface{}) error {
  194. ocId := m["ocId"].(int64)
  195. msgId := m["msgId"].(int64)
  196. deletedBy := m["deletedBy"].(int64)
  197. data := &datamodel.Msg{}
  198. data.DeletedFlag = 1
  199. data.DeletedBy = deletedBy
  200. data.DeletedAt = time.Now()
  201. _, err := d.engine.
  202. Where("oc_id = ?", ocId).
  203. Where("msg_id = ?", msgId).
  204. Update(data)
  205. return err
  206. }
  207. func (d *MsgRepo) GetUnReadCount(ocId, msgToCc int64) int {
  208. return 0
  209. }