community_question.go 13 KB

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