community_question.go 13 KB

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