question.go 13 KB

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