community_question.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. package yb
  2. import (
  3. "errors"
  4. "fmt"
  5. ybResponse "hongze/hongze_mobile_admin/models/response/yb"
  6. "hongze/hongze_mobile_admin/models/tables/admin"
  7. "hongze/hongze_mobile_admin/models/tables/company"
  8. "hongze/hongze_mobile_admin/models/tables/company_approval_message"
  9. "hongze/hongze_mobile_admin/models/tables/sys_role"
  10. "hongze/hongze_mobile_admin/models/tables/sys_role_admin"
  11. "hongze/hongze_mobile_admin/models/tables/user_record"
  12. "hongze/hongze_mobile_admin/models/tables/variety_classify"
  13. "hongze/hongze_mobile_admin/models/tables/variety_tag"
  14. "hongze/hongze_mobile_admin/models/tables/wx_user"
  15. "hongze/hongze_mobile_admin/models/tables/yb_community_question"
  16. "hongze/hongze_mobile_admin/services"
  17. "hongze/hongze_mobile_admin/services/alarm_msg"
  18. "hongze/hongze_mobile_admin/utils"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. // GetQuestionList 问题列表
  24. func GetQuestionList(condition string, pars []interface{}, startSize, pageSize int) (total int, resp *ybResponse.CommunityQuestionListResp, err error) {
  25. resp = new(ybResponse.CommunityQuestionListResp)
  26. total, list, e := yb_community_question.GetCommunityQuestionList(condition, pars, startSize, pageSize)
  27. if e != nil {
  28. err = errors.New("获取问题列表失败 Err:" + e.Error())
  29. return
  30. }
  31. if len(list) == 0 {
  32. return
  33. }
  34. // 判断是否存在已禁用的回复人, 需要重新分配回复人
  35. adminIdArr := make([]string, 0)
  36. questionLen := len(list)
  37. for i := 0; i < questionLen; i++ {
  38. if list[i].ReplierAdminId > 0 {
  39. adminIdArr = append(adminIdArr, strconv.Itoa(list[i].ReplierAdminId))
  40. }
  41. }
  42. //管理员信息
  43. adminEnableMap := make(map[int]int, 0)
  44. if len(adminIdArr) > 0 {
  45. adminIds := strings.Join(adminIdArr, ",")
  46. adminList, tmpErr := admin.GetAdminListByIds(adminIds)
  47. if tmpErr != nil {
  48. err = tmpErr
  49. return
  50. }
  51. adminLen := len(adminList)
  52. if adminLen > 0 {
  53. for i := 0; i < adminLen; i++ {
  54. adminEnableMap[adminList[i].AdminId] = adminList[i].Enabled
  55. }
  56. }
  57. }
  58. respList := make([]*ybResponse.CommunityQuestionItem, 0)
  59. for _, v := range list {
  60. // 根据回复人被禁用/待回答/已推送消息判断是否需要重新分配
  61. needReset := false
  62. adminEnable := 1
  63. if v.ReplierAdminId > 0 {
  64. adminEnable = adminEnableMap[v.ReplierAdminId]
  65. }
  66. if adminEnable == 0 && v.ReplyStatus == 2 && v.MsgSendStatus >= 1 {
  67. needReset = true
  68. }
  69. item := &ybResponse.CommunityQuestionItem{
  70. CommunityQuestionId: v.CommunityQuestionId,
  71. UserId: v.UserId,
  72. Mobile: v.Mobile,
  73. RealName: v.RealName,
  74. QuestionContent: v.QuestionContent,
  75. ReplierUserId: v.ReplierUserId,
  76. ReplierAdminId: v.ReplierAdminId,
  77. ReplierRealName: v.ReplierRealName,
  78. ReplierAvatar: v.ReplierAvatar,
  79. ResearchGroupFirstId: v.ResearchGroupFirstId,
  80. ResearchGroupSecondId: v.ResearchGroupSecondId,
  81. ResearchGroupFirstName: v.ResearchGroupFirstName,
  82. ResearchGroupSecondName: v.ResearchGroupSecondName,
  83. ReplyStatus: v.ReplyStatus,
  84. MsgSendStatus: v.MsgSendStatus,
  85. NeedRedistribute: needReset,
  86. CreateTime: v.CreateTime.Format(utils.FormatDateTime),
  87. ReplyTime: v.ReplyTime.Format(utils.FormatDateTime),
  88. ClickNum: v.ClickNum,
  89. }
  90. respList = append(respList, item)
  91. }
  92. // 数量统计
  93. //countList, e := yb_community_question.GetCommunityQuestionCount()
  94. //if e != nil {
  95. // err = errors.New("获取问题数量统计失败 Err:" + e.Error())
  96. // return
  97. //}
  98. //respCount := new(ybResponse.CommunityQuestionCount)
  99. //for _, v := range countList {
  100. // if v.ReplyStatus == 1 {
  101. // respCount.Free = v.Total
  102. // continue
  103. // }
  104. // if v.ReplyStatus == 2 {
  105. // respCount.Wait = v.Total
  106. // continue
  107. // }
  108. // if v.ReplyStatus == 3 {
  109. // respCount.Replied = v.Total
  110. // continue
  111. // }
  112. //}
  113. //respCount.Total = respCount.Free + respCount.Wait + respCount.Replied
  114. resp.List = respList
  115. //resp.Count = respCount
  116. return
  117. }
  118. // GetQuestionCompanyUser 获取提问者详情
  119. func GetQuestionCompanyUser(questionId int) (ret *ybResponse.QuestionCompanyUser, err error) {
  120. questionInfo, e := yb_community_question.GetQuestionById(questionId)
  121. if e != nil {
  122. err = errors.New("提问信息有误 Err:" + e.Error())
  123. return
  124. }
  125. companyUserList, err := company.GetFiccCompanyUserByUserIds(strconv.Itoa(questionInfo.UserId))
  126. if err != nil {
  127. err = errors.New("获取客户信息失败 Err:" + err.Error())
  128. return
  129. }
  130. if len(companyUserList) > 0 {
  131. item := companyUserList[0]
  132. ret = &ybResponse.QuestionCompanyUser{
  133. UserId: int(item.UserId),
  134. CompanyStatus: item.Status,
  135. CompanyName: item.CompanyName,
  136. RealName: item.RealName,
  137. CompanyId: item.CompanyId,
  138. QuestionContent: questionInfo.QuestionContent,
  139. CommunityQuestionId: questionInfo.CommunityQuestionId,
  140. }
  141. } else {
  142. err = errors.New("用户不存在")
  143. return
  144. }
  145. return
  146. }
  147. // DistributeQuestion 分配回复人
  148. func DistributeQuestion(questionId, adminId, researchGroupFirstId, researchGroupSecondId, distributeId int) (errMsg string, err error) {
  149. errMsg = "操作成功"
  150. // 校验提问信息
  151. item, e := yb_community_question.GetQuestionById(questionId)
  152. if e != nil {
  153. errMsg = "分配失败, 提问信息有误"
  154. err = errors.New("提问信息有误 Err:" + e.Error())
  155. return
  156. }
  157. contentRune := []rune(item.QuestionContent)
  158. if len(contentRune) > 28 {
  159. errMsg = "问题字数不可超过28个字符"
  160. err = errors.New("问题字数不可超过28个字符")
  161. return
  162. }
  163. if item.ReplyStatus == 3 {
  164. errMsg = "分配失败, 回复状态有误"
  165. err = errors.New(fmt.Sprintf("分配失败, 回复状态有误, ReplyStatus:%d", item.ReplyStatus))
  166. return
  167. }
  168. // 获取研究员信息
  169. adminInfo, e := admin.GetAdminById(adminId)
  170. if e != nil {
  171. errMsg = "分配失败, 研究员信息有误"
  172. err = errors.New("研究员信息有误 Err:" + e.Error())
  173. return
  174. }
  175. if adminInfo.Mobile == "" {
  176. errMsg = "分配失败, 研究员手机号有误"
  177. err = errors.New("研究员手机号为空")
  178. return
  179. }
  180. // 获取研究员关联的联系人信息
  181. companyId := 16
  182. userInfo, e := wx_user.GetWxUserByCompanyIdAndMobile(companyId, adminInfo.Mobile)
  183. if e != nil {
  184. if e.Error() == utils.ErrNoRow() {
  185. errMsg = "分配失败, 未找到研究员手机号对应的联系人信息"
  186. err = errors.New("未获取到相关联系人信息")
  187. return
  188. }
  189. errMsg = "分配失败"
  190. err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
  191. return
  192. }
  193. // 回复人openid, 此处可能会出现取不到openid的情况, 可直接忽略掉
  194. replierUserId := int(userInfo.UserId)
  195. userRecord, e := user_record.GetUserRecordByUserId(replierUserId, utils.USER_RECORD_PLATFORM_RDDP)
  196. if e != nil && e.Error() != utils.ErrNoRow() {
  197. errMsg = "分配失败, 研究员相关的联系人记录有误"
  198. err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
  199. return
  200. }
  201. replierOpenid := ""
  202. if userRecord != nil {
  203. if userRecord.Subscribe == 0 {
  204. errMsg = "该研究员已取消关注公众号,无法收到消息通知"
  205. } else {
  206. replierOpenid = userRecord.OpenId
  207. }
  208. } else {
  209. errMsg = "该研究员未关注公众号,无法收到消息通知"
  210. }
  211. // 分组、品种权限信息
  212. //firstGroup, e := admin.GetResearchGroupById(researchGroupFirstId)
  213. firstGroup, e := variety_classify.GetVarietyClassifyById(researchGroupFirstId)
  214. if e != nil {
  215. errMsg = "分配失败, 一级分组信息有误"
  216. err = errors.New("获取一级分组信息失败, Err:" + e.Error())
  217. return
  218. }
  219. //secondGroup, e := admin.GetResearchGroupById(researchGroupSecondId)
  220. secondGroup, e := variety_tag.GetVarietyTagById(researchGroupSecondId)
  221. if e != nil {
  222. errMsg = "分配失败, 二级分组信息有误"
  223. err = errors.New("获取二级分组信息失败, Err:" + e.Error())
  224. return
  225. }
  226. // 0627-不绑定品种权限了
  227. //permissionInfo, e := models.GetChartPermissionById(secondGroup.ChartPermissionId)
  228. //if e != nil {
  229. // errMsg = "分配失败, 品种权限信息有误"
  230. // err = errors.New("获取品种权限信息失败, Err:" + e.Error())
  231. // return
  232. //}
  233. // 更新提问信息
  234. updateCols := make([]string, 0)
  235. updateCols = append(updateCols, "ReplierUserId", "ReplierOpenid", "ReplierAdminId", "ReplierRealName", "ReplierAvatar", "ResearchGroupFirstId",
  236. "ResearchGroupSecondId", "ResearchGroupFirstName", "ResearchGroupSecondName", "DistributeAdminId", "DistributeTime", "VarietyTagId",
  237. "VarietyTagName", "ReplyStatus", "ReplierIsRead", "MsgSendStatus", "ModifyTime")
  238. item.ReplierUserId = replierUserId
  239. item.ReplierOpenid = replierOpenid
  240. item.ReplierAdminId = adminId
  241. item.ReplierRealName = adminInfo.RealName
  242. item.ReplierAvatar = adminInfo.AdminAvatar
  243. item.ResearchGroupFirstId = researchGroupFirstId
  244. item.ResearchGroupSecondId = researchGroupSecondId
  245. item.ResearchGroupFirstName = firstGroup.ClassifyName
  246. item.ResearchGroupSecondName = secondGroup.TagName
  247. item.DistributeAdminId = distributeId
  248. item.DistributeTime = time.Now().Local()
  249. item.VarietyTagId = secondGroup.VarietyTagId
  250. item.VarietyTagName = secondGroup.TagName
  251. item.ReplyStatus = 2
  252. item.ReplierIsRead = 0
  253. item.MsgSendStatus = 0
  254. item.ModifyTime = time.Now().Local()
  255. if e := item.Update(updateCols); e != nil {
  256. errMsg = "分配失败,更新提问信息失败"
  257. err = errors.New("更新提问信息失败, Err:" + e.Error())
  258. }
  259. return
  260. }
  261. // SoftDeleteQuestion 删除问题
  262. func SoftDeleteQuestion(questionId int) (err error) {
  263. if _, e := yb_community_question.GetQuestionById(questionId); e != nil {
  264. err = errors.New("提问信息有误 Err:" + e.Error())
  265. return
  266. }
  267. if e := yb_community_question.DeleteQuestion(questionId); e != nil {
  268. err = errors.New("删除提问失败 Err:" + e.Error())
  269. }
  270. // 删除问答后的逻辑处理
  271. go afterDeleteQuestion(questionId)
  272. return
  273. }
  274. // SendMsgToReplier 推送消息给回复人
  275. func SendMsgToReplier(questionId int) (errMsg string, err error) {
  276. defer func() {
  277. if err != nil {
  278. go alarm_msg.SendAlarmMsg(fmt.Sprintf("问答分配给研究员后,推送消息失败,问答id:%d;errMsg:%s;ERR:%s", questionId, errMsg, err.Error()), 3)
  279. }
  280. }()
  281. errMsg = "推送成功"
  282. item, e := yb_community_question.GetQuestionById(questionId)
  283. if e != nil {
  284. errMsg = "问答信息有误"
  285. err = errors.New("提问信息有误, Err:" + e.Error())
  286. return
  287. }
  288. if item.MsgSendStatus >= 1 {
  289. return
  290. }
  291. if item.ReplierUserId == 0 {
  292. errMsg = "请先分配回复人"
  293. err = errors.New("未分配回复人, 不可推送")
  294. return
  295. }
  296. // 回复人openid为空时查询当前是否已有openid
  297. updateCols := make([]string, 0)
  298. if item.ReplierOpenid == "" {
  299. userRecord, e := user_record.GetUserRecordByUserId(item.ReplierUserId, utils.USER_RECORD_PLATFORM_RDDP)
  300. if e != nil && e.Error() != utils.ErrNoRow() {
  301. errMsg = "发送失败, 研究员相关的联系人记录有误"
  302. err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
  303. return
  304. }
  305. if userRecord == nil {
  306. errMsg = "该研究员未关注公众号,无法发送消息通知"
  307. err = errors.New("回复人openid为空, 不可推送")
  308. return
  309. }
  310. if userRecord.Subscribe == 0 {
  311. errMsg = "该研究员已取消关注公众号,无法发送消息通知"
  312. err = errors.New("回复人取消关注了公众号, 不可推送")
  313. return
  314. }
  315. updateCols = append(updateCols, "ReplierOpenid")
  316. item.ReplierOpenid = userRecord.OpenId
  317. }
  318. if e := services.SendYbQuestionDistributeWxMsg(item.CommunityQuestionId, item.ReplierUserId, item.ReplierOpenid, item.QuestionContent); e != nil {
  319. err = errors.New("推送模板消息失败, Err:" + e.Error())
  320. return
  321. }
  322. // 更新问答信息
  323. updateCols = append(updateCols, "ModifyTime", "MsgSendStatus")
  324. item.ModifyTime = time.Now().Local()
  325. item.MsgSendStatus = 1
  326. if e := item.Update(updateCols); e != nil {
  327. err = errors.New("更新问答信息失败, Err:" + e.Error())
  328. }
  329. return
  330. }
  331. // EditQuestion 编辑问题
  332. func EditQuestion(questionId int, content string) (errMsg string, err error) {
  333. item, e := yb_community_question.GetQuestionById(questionId)
  334. if e != nil {
  335. errMsg = "提问信息有误"
  336. err = errors.New("提问信息有误 Err:" + e.Error())
  337. return
  338. }
  339. if item.MsgSendStatus >= 1 {
  340. errMsg = "问题状态有误,不可编辑"
  341. err = errors.New(fmt.Sprintf("问题状态不可编辑, MsgSendStatus:%d", item.MsgSendStatus))
  342. return
  343. }
  344. updateCols := make([]string, 0)
  345. updateCols = append(updateCols, "QuestionContent", "ModifyTime")
  346. item.QuestionContent = content
  347. item.ModifyTime = time.Now().Local()
  348. if e := item.Update(updateCols); e != nil {
  349. errMsg = "更新提问信息失败"
  350. err = errors.New("更新提问信息失败, Err:" + e.Error())
  351. }
  352. return
  353. }
  354. // CheckCommunityQuestionPermission 查询当前操作用户是否运营管理员权限
  355. func CheckCommunityQuestionPermission(adminId int) (errMsg string, err error) {
  356. roleInfo, e := sys_role.GetSysRoleByRoleTypeCode("yb_question_admin")
  357. if e != nil {
  358. errMsg = "角色信息有误"
  359. if e.Error() == utils.ErrNoRow() {
  360. err = errors.New("角色不存在, Err: " + e.Error())
  361. return
  362. }
  363. err = errors.New("角色信息有误, Err: " + e.Error())
  364. return
  365. }
  366. _, e = sys_role_admin.GetRoleIdsByAdminIdRoleId(adminId, roleInfo.RoleId)
  367. if e != nil {
  368. errMsg = "无权操作"
  369. err = errors.New("无权操作, Err: " + e.Error())
  370. return
  371. }
  372. return
  373. }
  374. // afterDeleteQuestion 删除问答后的逻辑处理
  375. func afterDeleteQuestion(questionId int) {
  376. var err error
  377. defer func() {
  378. if err != nil {
  379. go alarm_msg.SendAlarmMsg("问答信息删除后,标记站内消息失败"+time.Now().Format(utils.FormatDateTime)+";Err:"+err.Error(), 3)
  380. }
  381. }()
  382. err = company_approval_message.CancelCompanyApprovalMessage(questionId, services.CompanyApprovalMessageSourceTypeByQuestion)
  383. return
  384. }