question.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package community
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_yb/models/request"
  6. "hongze/hongze_yb/models/response"
  7. "hongze/hongze_yb/models/tables/user_record"
  8. "hongze/hongze_yb/models/tables/yb_community_question"
  9. "hongze/hongze_yb/models/tables/yb_community_question_audio"
  10. "hongze/hongze_yb/services/company"
  11. "hongze/hongze_yb/services/user"
  12. "hongze/hongze_yb/services/wechat"
  13. "hongze/hongze_yb/utils"
  14. "time"
  15. )
  16. // GetQuestionList 获取问答列表
  17. func GetQuestionList(pageIndex, pageSize, onlyMine, chartPermissionId, replyStatus, replierUserId int, userInfo user.UserInfo) (resp *response.CommunityQuestionList, err error) {
  18. condition := make(map[string]interface{})
  19. condition["is_deleted ="] = 0
  20. // 用户身份
  21. isAdmin, _, e := user.GetAdminByUserInfo(userInfo)
  22. if e != nil {
  23. err = errors.New("获取用户身份失败 Err:" + e.Error())
  24. return
  25. }
  26. if replierUserId > 0 {
  27. condition["replier_user_id ="] = replierUserId
  28. // 回复列表
  29. if replyStatus > 0 {
  30. condition["reply_status ="] = replyStatus
  31. }
  32. } else {
  33. // 问题列表
  34. if onlyMine == 1 {
  35. if isAdmin {
  36. condition["replier_user_id ="] = userInfo.UserID
  37. } else {
  38. condition["user_id ="] = userInfo.UserID
  39. }
  40. } else {
  41. // 默认只展示已回复的
  42. condition["reply_status ="] = 3
  43. }
  44. }
  45. if chartPermissionId > 0 {
  46. condition["chart_permission_id ="] = chartPermissionId
  47. }
  48. // 问题列表
  49. questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize)
  50. if e != nil {
  51. err = errors.New("获取问题列表失败 Err:" + e.Error())
  52. return
  53. }
  54. listLen := len(questionList)
  55. if listLen == 0 {
  56. return
  57. }
  58. idArr := make([]int, 0)
  59. for i := 0; i < listLen; i++ {
  60. idArr = append(idArr, questionList[i].CommunityQuestionID)
  61. }
  62. // 音频列表
  63. audioList, e := yb_community_question_audio.GetListByQuestrionIds(idArr)
  64. if e != nil {
  65. err = errors.New("获取音频列表失败 Err:" + e.Error())
  66. return
  67. }
  68. // 用户权限
  69. authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
  70. if e != nil {
  71. err = errors.New("获取用户权限失败 Err:" + e.Error())
  72. return
  73. }
  74. userId := int(userInfo.UserID)
  75. resp = new(response.CommunityQuestionList)
  76. respList := make([]*response.CommunityQuestionItem, 0)
  77. for _, v := range questionList {
  78. audios := make([]*response.CommunityQuestionAudioItem, 0)
  79. for _, a := range audioList {
  80. if a.CommunityQuestionID == v.CommunityQuestionID {
  81. audios = append(audios, &response.CommunityQuestionAudioItem{
  82. CommunityQuestionID: a.CommunityQuestionID,
  83. AudioURL: a.AudioURL,
  84. AudioPlaySeconds: a.AudioPlaySeconds,
  85. AudioSize: a.AudioSize,
  86. Sort: a.Sort,
  87. })
  88. }
  89. }
  90. replierRank := fmt.Sprintf("弘则%s研究员", v.ResearchGroupFirstName)
  91. item := &response.CommunityQuestionItem{
  92. CommunityQuestionID: v.CommunityQuestionID,
  93. UserId: v.UserID,
  94. QuestionContent: v.QuestionContent,
  95. ReplierRealName: v.ReplierRealName,
  96. ReplierRank: replierRank,
  97. ReplierAvatar: v.ReplierAvatar,
  98. ChartPermissionID: v.CommunityQuestionID,
  99. ChartPermissionName: v.ChartPermissionName,
  100. IsRead: v.IsRead,
  101. CreateTime: v.CreateTime.Format(utils.FormatDateTime),
  102. ReplyTime: v.ReplyTime.Format(utils.FormatDateTime),
  103. AuthOk: authOk,
  104. PermissionInfo: permissionInfo,
  105. AudioList: audios,
  106. }
  107. if !isAdmin && item.IsRead == 0 && item.UserId == userId {
  108. item.IsTop = 1
  109. }
  110. respList = append(respList, item)
  111. }
  112. resp.QuestionList = respList
  113. //resp.PermissionInfo = permissionInfo
  114. return
  115. }
  116. // GetQuestionDetail 获取问答详情
  117. func GetQuestionDetail(questionId int, userInfo user.UserInfo) (item *response.CommunityQuestionItem, err error) {
  118. detail, e := yb_community_question.GetItemById(questionId)
  119. if e != nil {
  120. err = errors.New("获取问题详情失败 Err:" + e.Error())
  121. return
  122. }
  123. audioList, e := yb_community_question_audio.GetListByQuestionId(questionId)
  124. if e != nil {
  125. err = errors.New("获取问题音频失败 Err:" + e.Error())
  126. return
  127. }
  128. audios := make([]*response.CommunityQuestionAudioItem, 0)
  129. for _, a := range audioList {
  130. audios = append(audios, &response.CommunityQuestionAudioItem{
  131. CommunityQuestionID: a.CommunityQuestionID,
  132. AudioURL: a.AudioURL,
  133. AudioPlaySeconds: a.AudioPlaySeconds,
  134. AudioSize: a.AudioSize,
  135. Sort: a.Sort,
  136. })
  137. }
  138. replierRank := fmt.Sprintf("弘则%s研究员", detail.ResearchGroupFirstName)
  139. // 用户权限
  140. authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
  141. if e != nil {
  142. err = errors.New("获取用户权限失败 Err:" + e.Error())
  143. return
  144. }
  145. item = &response.CommunityQuestionItem{
  146. CommunityQuestionID: detail.CommunityQuestionID,
  147. UserId: detail.UserID,
  148. QuestionContent: detail.QuestionContent,
  149. ReplierRealName: detail.ReplierRealName,
  150. ReplierRank: replierRank,
  151. ReplierAvatar: detail.ReplierAvatar,
  152. ChartPermissionID: detail.ChartPermissionID,
  153. ChartPermissionName: detail.ChartPermissionName,
  154. IsRead: detail.IsRead,
  155. CreateTime: detail.CreateTime.Format(utils.FormatDateTime),
  156. ReplyTime: detail.ReplyTime.Format(utils.FormatDateTime),
  157. AuthOk: authOk,
  158. PermissionInfo: permissionInfo,
  159. AudioList: audios,
  160. }
  161. return
  162. }
  163. // CreateQuestion 新增问答
  164. func CreateQuestion(userId int, mobile, realName, content string) (err error) {
  165. // 获取用户公众号openid, 获取不到则置空
  166. userRecord, e := user_record.GetByUserId(userId, utils.USER_RECORD_PLATFORM_RDDP)
  167. if e != nil && e == utils.ErrNoRow {
  168. err = errors.New("获取用户公众号openid失败 Err:" + e.Error())
  169. return
  170. }
  171. openid := ""
  172. if userRecord != nil {
  173. openid = userRecord.OpenID
  174. }
  175. item := &yb_community_question.YbCommunityQuestion{
  176. UserID: userId,
  177. UserOpenid: openid,
  178. Mobile: mobile,
  179. RealName: realName,
  180. QuestionContent: content,
  181. ReplyStatus: 1,
  182. }
  183. if e := item.Create(); e != nil {
  184. err = errors.New("新增问题失败 Err:" + e.Error())
  185. }
  186. return
  187. }
  188. // ReplyUserQuestion 回复问题
  189. func ReplyUserQuestion(replierId, questionId int, audios []*request.ReplyReqAudioList) (err error) {
  190. item, e := yb_community_question.GetItemById(questionId)
  191. if e != nil {
  192. err = errors.New("获取提问信息失败 Err:" + e.Error())
  193. return
  194. }
  195. if item.ReplyStatus < 2 {
  196. err = errors.New("回复状态有误")
  197. return
  198. }
  199. if item.ReplierUserID != replierId {
  200. err = errors.New(fmt.Sprintf("回复人与分配人不匹配, 回复人ID: %d, 分配人ID: %d", item.ReplierUserID, replierId))
  201. return
  202. }
  203. // 问题
  204. updateCols := make([]string, 0)
  205. updateCols = append(updateCols, "reply_status", "reply_time", "modify_time")
  206. nowTime := time.Now().Local()
  207. item.ReplyStatus = 3
  208. item.ReplyTime = nowTime
  209. item.ModifyTime = nowTime
  210. // 音频
  211. audioList := make([]*yb_community_question_audio.YbCommunityQuestionAudio, 0)
  212. for _, v := range audios {
  213. audioList = append(audioList, &yb_community_question_audio.YbCommunityQuestionAudio{
  214. CommunityQuestionID: questionId,
  215. AudioURL: v.AudioUrl,
  216. AudioPlaySeconds: v.AudioPlaySeconds,
  217. AudioSize: v.AudioSize,
  218. Sort: v.Sort,
  219. CreateTime: nowTime,
  220. })
  221. }
  222. if e := yb_community_question.UpdateQuestionAndAudioList(item, updateCols, audioList); e != nil {
  223. err = errors.New("UpdateQuestionAndAudioList Err:" + e.Error())
  224. return
  225. }
  226. // 推送回复消息给用户
  227. go wechat.SendQuestionReplyWxMsg(item.CommunityQuestionID, item.UserID, item.UserOpenid, item.QuestionContent)
  228. return
  229. }
  230. // ReadQuestionReply 回复已读
  231. func ReadQuestionReply(userId int, questionId int) (err error) {
  232. item, e := yb_community_question.GetItemById(questionId)
  233. if e != nil {
  234. err = errors.New("获取提问信息失败 Err:" + e.Error())
  235. return
  236. }
  237. if item.IsRead == 1 {
  238. return
  239. }
  240. if item.UserID == userId {
  241. updateCols := make([]string, 0)
  242. updateCols = append(updateCols, "is_read", "modify_time")
  243. item.IsRead = 1
  244. item.ModifyTime = time.Now().Local()
  245. if e = item.Update(updateCols); e != nil {
  246. err = errors.New("更新问题已读失败 Err:" + e.Error())
  247. }
  248. }
  249. return
  250. }
  251. // GetReplyListTotal 获取问答列表数量统计
  252. func GetReplyListTotal(replierUserId int) (resp *response.CommunityReplyTotal, err error) {
  253. countList, e := yb_community_question.GetReplierQuestionCount(replierUserId)
  254. if e != nil {
  255. err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
  256. return
  257. }
  258. resp = new(response.CommunityReplyTotal)
  259. for _, v := range countList {
  260. if v.ReplyStatus == 2 {
  261. resp.Wait = v.Total
  262. continue
  263. }
  264. if v.ReplyStatus == 3 {
  265. resp.Replied = v.Total
  266. }
  267. }
  268. resp.Total = resp.Wait + resp.Replied
  269. return
  270. }