question.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  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/research_group"
  8. "hongze/hongze_yb/models/tables/user_record"
  9. "hongze/hongze_yb/models/tables/yb_community_audio_listen_log"
  10. "hongze/hongze_yb/models/tables/yb_community_question"
  11. "hongze/hongze_yb/models/tables/yb_community_question_audio"
  12. "hongze/hongze_yb/services/user"
  13. "hongze/hongze_yb/services/wechat"
  14. "hongze/hongze_yb/utils"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. // GetQuestionList 获取问答列表
  20. func GetQuestionList(pageIndex, pageSize, onlyMine, varietyTagId, replyStatus, groupId int, userInfo user.UserInfo) (resp []*response.CommunityQuestionItem, err error) {
  21. condition := make(map[string]interface{})
  22. condition["is_deleted ="] = 0
  23. // 用户身份
  24. isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
  25. if e != nil {
  26. err = errors.New("获取用户身份失败 Err:" + e.Error())
  27. return
  28. }
  29. if onlyMine == 1 {
  30. if isResearcher {
  31. condition["replier_user_id ="] = userInfo.UserID
  32. } else {
  33. condition["user_id ="] = userInfo.UserID
  34. }
  35. }
  36. if replyStatus > 0 {
  37. if replyStatus == 2 && !isResearcher {
  38. // 普通用户待回答为待分配和待回答
  39. condition["reply_status >"] = 0
  40. condition["reply_status <"] = 3
  41. } else {
  42. condition["reply_status ="] = replyStatus
  43. }
  44. } else {
  45. if isResearcher {
  46. // 不展示未分配的
  47. condition["reply_status >"] = 1
  48. }
  49. }
  50. if varietyTagId > 0 {
  51. condition["variety_tag_id ="] = varietyTagId
  52. }
  53. if groupId > 0 {
  54. condition["research_group_second_id ="] = groupId
  55. }
  56. // 问题列表
  57. questionList, e := yb_community_question.GetPageListByCondition(condition, pageIndex, pageSize)
  58. if e != nil {
  59. err = errors.New("获取问题列表失败 Err:" + e.Error())
  60. return
  61. }
  62. listLen := len(questionList)
  63. if listLen == 0 {
  64. return
  65. }
  66. idArr := make([]int, 0)
  67. for i := 0; i < listLen; i++ {
  68. idArr = append(idArr, questionList[i].CommunityQuestionID)
  69. }
  70. // 音频列表
  71. audioList, e := yb_community_question_audio.GetListByQuestrionIds(idArr)
  72. if e != nil {
  73. err = errors.New("获取音频列表失败 Err:" + e.Error())
  74. return
  75. }
  76. // 用户权限
  77. //authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
  78. //if e != nil {
  79. // err = errors.New("获取用户权限失败 Err:" + e.Error())
  80. // return
  81. //}
  82. userId := int(userInfo.UserID)
  83. resp = make([]*response.CommunityQuestionItem, 0)
  84. for _, v := range questionList {
  85. audios := make([]*response.CommunityQuestionAudioItem, 0)
  86. for _, a := range audioList {
  87. if a.CommunityQuestionID == v.CommunityQuestionID {
  88. audios = append(audios, &response.CommunityQuestionAudioItem{
  89. CommunityQuestionAudioID: a.CommunityQuestionAudioID,
  90. CommunityQuestionID: a.CommunityQuestionID,
  91. AudioURL: a.AudioURL,
  92. AudioPlaySeconds: a.AudioPlaySeconds,
  93. AudioSize: a.AudioSize,
  94. Sort: a.Sort,
  95. })
  96. }
  97. }
  98. replierRank := fmt.Sprintf("弘则%s研究员", v.ResearchGroupFirstName)
  99. avatar := v.ReplierAvatar
  100. if avatar == "" {
  101. avatar = utils.HZ_DEFAULT_AVATAR
  102. }
  103. item := &response.CommunityQuestionItem{
  104. CommunityQuestionID: v.CommunityQuestionID,
  105. UserId: v.UserID,
  106. QuestionContent: v.QuestionContent,
  107. ReplierRealName: v.ReplierRealName,
  108. ReplierRank: replierRank,
  109. ReplierAvatar: avatar,
  110. VarietyTagId: v.VarietyTagID,
  111. VarietyTagName: v.VarietyTagName,
  112. ResearchGroupSecondId: v.ResearchGroupSecondID,
  113. ResearchGroupSecondName: v.ResearchGroupSecondName,
  114. IsRead: v.IsRead,
  115. ReplierIsRead: v.ReplierIsRead,
  116. ReplyStatus: v.ReplyStatus,
  117. CreateTime: v.CreateTime.Format(utils.FormatDateTime),
  118. ReplyTime: v.ReplyTime.Format(utils.FormatDateTime),
  119. //AuthOk: authOk,
  120. //PermissionInfo: permissionInfo,
  121. AudioList: audios,
  122. }
  123. if !isResearcher && item.IsRead == 0 && item.UserId == userId {
  124. item.IsTop = 1
  125. }
  126. resp = append(resp, item)
  127. }
  128. return
  129. }
  130. // GetQuestionDetail 获取问答详情
  131. func GetQuestionDetail(questionId int, userInfo user.UserInfo) (item *response.CommunityQuestionItem, errMsg string, err error) {
  132. detail, e := yb_community_question.GetItemById(questionId)
  133. errMsg = "获取失败"
  134. if e != nil {
  135. if e == utils.ErrNoRow {
  136. errMsg = "问题已被删除"
  137. }
  138. err = errors.New("获取问题详情失败 Err:" + e.Error())
  139. return
  140. }
  141. audioList, e := yb_community_question_audio.GetListByQuestionId(questionId)
  142. if e != nil {
  143. err = errors.New("获取问题音频失败 Err:" + e.Error())
  144. return
  145. }
  146. audios := make([]*response.CommunityQuestionAudioItem, 0)
  147. for _, a := range audioList {
  148. audios = append(audios, &response.CommunityQuestionAudioItem{
  149. CommunityQuestionAudioID: a.CommunityQuestionAudioID,
  150. CommunityQuestionID: a.CommunityQuestionID,
  151. AudioURL: a.AudioURL,
  152. AudioPlaySeconds: a.AudioPlaySeconds,
  153. AudioSize: a.AudioSize,
  154. Sort: a.Sort,
  155. })
  156. }
  157. replierRank := fmt.Sprintf("弘则%s研究员", detail.ResearchGroupFirstName)
  158. // 用户权限
  159. //authOk, permissionInfo, _, e := company.CheckBaseFiccPermission(userInfo.CompanyID, int(userInfo.UserID))
  160. //if e != nil {
  161. // err = errors.New("获取用户权限失败 Err:" + e.Error())
  162. // return
  163. //}
  164. avatar := detail.ReplierAvatar
  165. if avatar == "" {
  166. avatar = utils.HZ_DEFAULT_AVATAR
  167. }
  168. item = &response.CommunityQuestionItem{
  169. CommunityQuestionID: detail.CommunityQuestionID,
  170. UserId: detail.UserID,
  171. QuestionContent: detail.QuestionContent,
  172. ReplierRealName: detail.ReplierRealName,
  173. ReplierRank: replierRank,
  174. ReplierAvatar: detail.ReplierAvatar,
  175. VarietyTagId: detail.VarietyTagID,
  176. VarietyTagName: detail.VarietyTagName,
  177. ResearchGroupSecondId: detail.ResearchGroupSecondID,
  178. ResearchGroupSecondName: detail.ResearchGroupSecondName,
  179. IsRead: detail.IsRead,
  180. ReplierIsRead: detail.ReplierIsRead,
  181. ReplyStatus: detail.ReplyStatus,
  182. CreateTime: detail.CreateTime.Format(utils.FormatDateTime),
  183. ReplyTime: detail.ReplyTime.Format(utils.FormatDateTime),
  184. //AuthOk: authOk,
  185. //PermissionInfo: permissionInfo,
  186. AudioList: audios,
  187. }
  188. errMsg = "获取成功"
  189. return
  190. }
  191. // CreateQuestion 新增问答
  192. func CreateQuestion(userId int, mobile, realName, content string) (err error) {
  193. // 获取用户公众号openid, 获取不到则置空
  194. userRecord, e := user_record.GetByUserId(userId, utils.USER_RECORD_PLATFORM_RDDP)
  195. if e != nil && e != utils.ErrNoRow {
  196. err = errors.New("获取用户公众号openid失败 Err:" + e.Error())
  197. return
  198. }
  199. openid := ""
  200. if userRecord != nil {
  201. openid = userRecord.OpenID
  202. }
  203. item := &yb_community_question.YbCommunityQuestion{
  204. UserID: userId,
  205. UserOpenid: openid,
  206. Mobile: mobile,
  207. RealName: realName,
  208. QuestionContent: content,
  209. ReplyStatus: 1,
  210. IsRead: 1,
  211. ReplierIsRead: 1,
  212. }
  213. if e := item.Create(); e != nil {
  214. err = errors.New("新增问题失败 Err:" + e.Error())
  215. }
  216. return
  217. }
  218. // ReplyUserQuestion 回复问题
  219. func ReplyUserQuestion(replierId, questionId int, audios []*request.ReplyReqAudioList) (errMsg string, err error) {
  220. item, e := yb_community_question.GetItemById(questionId)
  221. if e != nil {
  222. errMsg = "问答信息有误"
  223. err = errors.New("获取提问信息失败 Err:" + e.Error())
  224. return
  225. }
  226. if item.ReplyStatus < 2 {
  227. errMsg = "回复状态有误"
  228. err = errors.New("回复状态有误")
  229. return
  230. }
  231. if item.ReplyStatus == 3 {
  232. errMsg = "请勿重复提交"
  233. err = errors.New("问题已回复,请勿重复提交")
  234. return
  235. }
  236. if item.ReplierUserID != replierId {
  237. errMsg = "回复人不匹配"
  238. err = errors.New(fmt.Sprintf("回复人与分配人不匹配, 当前回复人ID: %d, 分配的回复人ID: %d", replierId, item.ReplierUserID))
  239. return
  240. }
  241. // 问题
  242. updateCols := make([]string, 0)
  243. updateCols = append(updateCols, "reply_status", "reply_time", "modify_time", "msg_send_status", "is_read")
  244. nowTime := time.Now().Local()
  245. item.ReplyStatus = 3
  246. item.ReplyTime = nowTime
  247. item.ModifyTime = nowTime
  248. item.MsgSendStatus = 2
  249. item.IsRead = 0
  250. // 音频
  251. audioList := make([]*yb_community_question_audio.YbCommunityQuestionAudio, 0)
  252. for _, v := range audios {
  253. audioList = append(audioList, &yb_community_question_audio.YbCommunityQuestionAudio{
  254. CommunityQuestionID: questionId,
  255. AudioURL: v.AudioUrl,
  256. AudioPlaySeconds: v.AudioPlaySeconds,
  257. AudioSize: v.AudioSize,
  258. Sort: v.Sort,
  259. CreateTime: nowTime,
  260. })
  261. }
  262. if e := yb_community_question.UpdateQuestionAndAudioList(item, updateCols, audioList); e != nil {
  263. err = errors.New("UpdateQuestionAndAudioList Err:" + e.Error())
  264. return
  265. }
  266. // 推送回复消息给用户
  267. go wechat.SendQuestionReplyWxMsg(item.CommunityQuestionID, item.UserID, item.QuestionContent)
  268. return
  269. }
  270. // ReadQuestionReply 回复已读
  271. func ReadQuestionReply(questionIds string, userInfo user.UserInfo) (err error) {
  272. if questionIds == "" {
  273. return
  274. }
  275. questionIdArr := make([]int, 0)
  276. questionIdStrArr := strings.Split(questionIds, ",")
  277. for _, v := range questionIdStrArr {
  278. i, _ := strconv.Atoi(v)
  279. questionIdArr = append(questionIdArr, i)
  280. }
  281. if len(questionIdArr) == 0 {
  282. return
  283. }
  284. isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
  285. if e != nil {
  286. err = errors.New("获取用户身份失败 Err:" + e.Error())
  287. return
  288. }
  289. if isResearcher {
  290. e = yb_community_question.UpdateReplierRead(int(userInfo.UserID), questionIdArr)
  291. } else {
  292. e = yb_community_question.UpdateUserRead(int(userInfo.UserID), questionIdArr)
  293. }
  294. if e != nil {
  295. err = errors.New("更新问答已读失败 Err:" + e.Error())
  296. }
  297. return
  298. }
  299. // GetQuestionListTotal 获取问答列表数量统计
  300. func GetQuestionListTotal(userInfo user.UserInfo) (resp *response.CommunityQuestionListTotal, err error) {
  301. isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
  302. if e != nil {
  303. err = errors.New("获取用户身份失败 Err:" + e.Error())
  304. return
  305. }
  306. condition := make(map[string]interface{}, 0)
  307. condition["is_deleted ="] = 0
  308. if isResearcher {
  309. condition["replier_user_id ="] = userInfo.UserID
  310. } else {
  311. condition["user_id ="] = userInfo.UserID
  312. }
  313. countList, e := yb_community_question.GetQuestionListCount(condition)
  314. if e != nil {
  315. err = errors.New("获取回复人问题统计失败 Err:" + e.Error())
  316. return
  317. }
  318. resp = new(response.CommunityQuestionListTotal)
  319. var distribute, wait, replied int
  320. for _, v := range countList {
  321. if v.ReplyStatus == 1 {
  322. distribute = v.Total
  323. }
  324. if v.ReplyStatus == 2 {
  325. wait = v.Total
  326. }
  327. if v.ReplyStatus == 3 {
  328. replied = v.Total
  329. }
  330. }
  331. if isResearcher {
  332. resp.Wait = wait
  333. } else {
  334. resp.Wait = distribute + wait
  335. }
  336. resp.Replied = replied
  337. resp.Total = resp.Wait + resp.Replied
  338. return
  339. }
  340. // GetMyQuestionUnread 获取我的未读数
  341. func GetMyQuestionUnread(userInfo user.UserInfo) (total int, err error) {
  342. isResearcher, _, e := user.GetResearcherByUserInfo(userInfo)
  343. if e != nil {
  344. err = errors.New("获取用户身份失败 Err:" + e.Error())
  345. return
  346. }
  347. condition := make(map[string]interface{}, 0)
  348. condition["is_deleted ="] = 0
  349. if isResearcher {
  350. condition["replier_user_id ="] = userInfo.UserID
  351. condition["replier_is_read ="] = 0
  352. } else {
  353. condition["user_id ="] = userInfo.UserID
  354. condition["is_read ="] = 0
  355. }
  356. num, e := yb_community_question.GetUnreadNum(condition)
  357. if e != nil {
  358. err = errors.New("获取我的未读数失败 Err:" + e.Error())
  359. return
  360. }
  361. total = int(num)
  362. return
  363. }
  364. // GetResearchGroupTree 获取研究方向分组
  365. func GetResearchGroupTree() (respList []*response.ResearchGroupItem, err error) {
  366. respList = make([]*response.ResearchGroupItem, 0)
  367. list, e := research_group.GetResearchGroupList()
  368. if e != nil {
  369. err = errors.New("获取研究方向分组失败, Err:" + e.Error())
  370. return
  371. }
  372. listLen := len(list)
  373. if listLen == 0 {
  374. return
  375. }
  376. // 分类
  377. firstList := make([]*response.ResearchGroupItem, 0)
  378. secondList := make([]*response.ResearchGroupItem, 0)
  379. for i := 0; i < listLen; i++ {
  380. item := new(response.ResearchGroupItem)
  381. item.ResearchGroupId = list[i].ResearchGroupID
  382. item.ResearchGroupName = list[i].ResearchGroupName
  383. item.ParentId = list[i].ParentID
  384. item.ChartPermissionId = list[i].ChartPermissionID
  385. item.Sort = list[i].Sort
  386. if list[i].ParentID == 0 {
  387. firstList = append(firstList, item)
  388. } else {
  389. secondList = append(secondList, item)
  390. }
  391. }
  392. if len(firstList) == 0 {
  393. return
  394. }
  395. // 匹配子分类
  396. for _, p := range firstList {
  397. children := make([]*response.ResearchGroupItem, 0)
  398. for _, child := range secondList {
  399. if p.ResearchGroupId == child.ParentId {
  400. children = append(children, child)
  401. }
  402. }
  403. p.Children = children
  404. }
  405. respList = firstList
  406. return
  407. }
  408. // AddAudioListenLog 添加用户点击音频日志
  409. func AddAudioListenLog(userInfo user.UserInfo, audioId int, sourceAgent int) (err error) {
  410. //1. 查询音频是否存在
  411. audio, err := yb_community_question_audio.GetByAudioId(audioId)
  412. if err != nil && err != utils.ErrNoRow {
  413. err = errors.New("查询音频信息失败 Err:" + err.Error())
  414. return
  415. }
  416. if err == utils.ErrNoRow {
  417. err = errors.New("音频不存在")
  418. return
  419. }
  420. if audio == nil {
  421. err = errors.New("音频不存在")
  422. return
  423. }
  424. //3. 添加点击日志
  425. item := &yb_community_audio_listen_log.YbCommunityAudioListenLog{
  426. CommunityQuestionAudioID: audio.CommunityQuestionAudioID,
  427. CommunityQuestionID: audio.CommunityQuestionID,
  428. UserID: int(userInfo.UserID),
  429. SourceAgent: sourceAgent,
  430. }
  431. if err = item.Create(); err != nil {
  432. err = errors.New("新增点击日志失败 Err:" + err.Error())
  433. return
  434. }
  435. return
  436. }