community_question.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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/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/services"
  16. "hongze/hongze_mobile_admin/services/alarm_msg"
  17. "hongze/hongze_mobile_admin/utils"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. // GetQuestionList 问题列表
  23. func GetQuestionList(condition string, pars []interface{}, startSize, pageSize int) (total int, resp *ybResponse.CommunityQuestionListResp, err error) {
  24. resp = new(ybResponse.CommunityQuestionListResp)
  25. total, list, e := community_question.GetCommunityQuestionList(condition, pars, startSize, pageSize)
  26. if e != nil {
  27. err = errors.New("获取问题列表失败 Err:" + e.Error())
  28. return
  29. }
  30. if len(list) == 0 {
  31. return
  32. }
  33. // 判断是否存在已禁用的回复人, 需要重新分配回复人
  34. adminIdArr := make([]string, 0)
  35. questionLen := len(list)
  36. for i := 0; i < questionLen; i++ {
  37. if list[i].ReplierAdminId > 0 {
  38. adminIdArr = append(adminIdArr, strconv.Itoa(list[i].ReplierAdminId))
  39. }
  40. }
  41. //管理员信息
  42. adminEnableMap := make(map[int]int, 0)
  43. if len(adminIdArr) > 0 {
  44. adminIds := strings.Join(adminIdArr, ",")
  45. adminList, tmpErr := admin.GetAdminListByIds(adminIds)
  46. if tmpErr != nil {
  47. err = tmpErr
  48. return
  49. }
  50. adminLen := len(adminList)
  51. if adminLen > 0 {
  52. for i := 0; i < adminLen; i++ {
  53. adminEnableMap[adminList[i].AdminId] = adminList[i].Enabled
  54. }
  55. }
  56. }
  57. respList := make([]*ybResponse.CommunityQuestionItem, 0)
  58. for _, v := range list {
  59. // 根据回复人被禁用/待回答/已推送消息判断是否需要重新分配
  60. needReset := false
  61. adminEnable := 1
  62. if v.ReplierAdminId > 0 {
  63. adminEnable = adminEnableMap[v.ReplierAdminId]
  64. }
  65. if adminEnable == 0 && v.ReplyStatus == 2 && v.MsgSendStatus >= 1 {
  66. needReset = true
  67. }
  68. item := &ybResponse.CommunityQuestionItem{
  69. CommunityQuestionId: v.CommunityQuestionId,
  70. UserId: v.UserId,
  71. Mobile: v.Mobile,
  72. RealName: v.RealName,
  73. QuestionContent: v.QuestionContent,
  74. ReplierUserId: v.ReplierUserId,
  75. ReplierAdminId: v.ReplierAdminId,
  76. ReplierRealName: v.ReplierRealName,
  77. ReplierAvatar: v.ReplierAvatar,
  78. ResearchGroupFirstId: v.ResearchGroupFirstId,
  79. ResearchGroupSecondId: v.ResearchGroupSecondId,
  80. ResearchGroupFirstName: v.ResearchGroupFirstName,
  81. ResearchGroupSecondName: v.ResearchGroupSecondName,
  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. firstGroup, e := variety_classify.GetVarietyClassifyById(researchGroupFirstId)
  213. if e != nil {
  214. errMsg = "分配失败, 一级分组信息有误"
  215. err = errors.New("获取一级分组信息失败, Err:" + e.Error())
  216. return
  217. }
  218. //secondGroup, e := admin.GetResearchGroupById(researchGroupSecondId)
  219. secondGroup, e := variety_tag.GetVarietyTagById(researchGroupSecondId)
  220. if e != nil {
  221. errMsg = "分配失败, 二级分组信息有误"
  222. err = errors.New("获取二级分组信息失败, Err:" + e.Error())
  223. return
  224. }
  225. // 0627-不绑定品种权限了
  226. //permissionInfo, e := models.GetChartPermissionById(secondGroup.ChartPermissionId)
  227. //if e != nil {
  228. // errMsg = "分配失败, 品种权限信息有误"
  229. // err = errors.New("获取品种权限信息失败, Err:" + e.Error())
  230. // return
  231. //}
  232. // 更新提问信息
  233. updateCols := make([]string, 0)
  234. updateCols = append(updateCols, "ReplierUserId", "ReplierOpenid", "ReplierAdminId", "ReplierRealName", "ReplierAvatar", "ResearchGroupFirstId",
  235. "ResearchGroupSecondId", "ResearchGroupFirstName", "ResearchGroupSecondName", "DistributeAdminId", "DistributeTime", "VarietyTagId",
  236. "VarietyTagName", "ReplyStatus", "ReplierIsRead", "MsgSendStatus", "ModifyTime")
  237. item.ReplierUserId = replierUserId
  238. item.ReplierOpenid = replierOpenid
  239. item.ReplierAdminId = adminId
  240. item.ReplierRealName = adminInfo.RealName
  241. item.ReplierAvatar = adminInfo.AdminAvatar
  242. item.ResearchGroupFirstId = researchGroupFirstId
  243. item.ResearchGroupSecondId = researchGroupSecondId
  244. item.ResearchGroupFirstName = firstGroup.ClassifyName
  245. item.ResearchGroupSecondName = secondGroup.TagName
  246. item.DistributeAdminId = distributeId
  247. item.DistributeTime = time.Now().Local()
  248. item.VarietyTagId = secondGroup.VarietyTagId
  249. item.VarietyTagName = secondGroup.TagName
  250. item.ReplyStatus = 2
  251. item.ReplierIsRead = 0
  252. item.MsgSendStatus = 0
  253. item.ModifyTime = time.Now().Local()
  254. if e := item.Update(updateCols); e != nil {
  255. errMsg = "分配失败,更新提问信息失败"
  256. err = errors.New("更新提问信息失败, Err:" + e.Error())
  257. }
  258. return
  259. }
  260. // SoftDeleteQuestion 删除问题
  261. func SoftDeleteQuestion(questionId int) (err error) {
  262. if _, e := community_question.GetQuestionById(questionId); e != nil {
  263. err = errors.New("提问信息有误 Err:" + e.Error())
  264. return
  265. }
  266. if e := community_question.DeleteQuestion(questionId); e != nil {
  267. err = errors.New("删除提问失败 Err:" + e.Error())
  268. }
  269. return
  270. }
  271. // SendMsgToReplier 推送消息给回复人
  272. func SendMsgToReplier(questionId int) (errMsg string, err error) {
  273. defer func() {
  274. if err != nil {
  275. go alarm_msg.SendAlarmMsg(fmt.Sprintf("问答分配给研究员后,推送消息失败,问答id:%d;errMsg:%s;ERR:%s", questionId, errMsg, err.Error()), 3)
  276. }
  277. }()
  278. errMsg = "推送成功"
  279. item, e := community_question.GetQuestionById(questionId)
  280. if e != nil {
  281. errMsg = "问答信息有误"
  282. err = errors.New("提问信息有误, Err:" + e.Error())
  283. return
  284. }
  285. if item.MsgSendStatus >= 1 {
  286. return
  287. }
  288. if item.ReplierUserId == 0 {
  289. errMsg = "请先分配回复人"
  290. err = errors.New("未分配回复人, 不可推送")
  291. return
  292. }
  293. // 回复人openid为空时查询当前是否已有openid
  294. updateCols := make([]string, 0)
  295. if item.ReplierOpenid == "" {
  296. userRecord, e := user_record.GetUserRecordByUserId(item.ReplierUserId, utils.USER_RECORD_PLATFORM_RDDP)
  297. if e != nil && e.Error() != utils.ErrNoRow() {
  298. errMsg = "发送失败, 研究员相关的联系人记录有误"
  299. err = errors.New("获取手机号所属联系人失败, Err:" + e.Error())
  300. return
  301. }
  302. if userRecord == nil {
  303. errMsg = "该研究员未关注公众号,无法发送消息通知"
  304. err = errors.New("回复人openid为空, 不可推送")
  305. return
  306. }
  307. if userRecord.Subscribe == 0 {
  308. errMsg = "该研究员已取消关注公众号,无法发送消息通知"
  309. err = errors.New("回复人取消关注了公众号, 不可推送")
  310. return
  311. }
  312. updateCols = append(updateCols, "ReplierOpenid")
  313. item.ReplierOpenid = userRecord.OpenId
  314. }
  315. if e := services.SendYbQuestionDistributeWxMsg(item.CommunityQuestionId, item.ReplierUserId, item.ReplierOpenid, item.QuestionContent); e != nil {
  316. err = errors.New("推送模板消息失败, Err:" + e.Error())
  317. return
  318. }
  319. // 更新问答信息
  320. updateCols = append(updateCols, "ModifyTime", "MsgSendStatus")
  321. item.ModifyTime = time.Now().Local()
  322. item.MsgSendStatus = 1
  323. if e := item.Update(updateCols); e != nil {
  324. err = errors.New("更新问答信息失败, Err:" + e.Error())
  325. }
  326. return
  327. }
  328. // EditQuestion 编辑问题
  329. func EditQuestion(questionId int, content string) (errMsg string, err error) {
  330. item, e := community_question.GetQuestionById(questionId)
  331. if e != nil {
  332. errMsg = "提问信息有误"
  333. err = errors.New("提问信息有误 Err:" + e.Error())
  334. return
  335. }
  336. if item.MsgSendStatus >= 1 {
  337. errMsg = "问题状态有误,不可编辑"
  338. err = errors.New(fmt.Sprintf("问题状态不可编辑, MsgSendStatus:%d", item.MsgSendStatus))
  339. return
  340. }
  341. updateCols := make([]string, 0)
  342. updateCols = append(updateCols, "QuestionContent", "ModifyTime")
  343. item.QuestionContent = content
  344. item.ModifyTime = time.Now().Local()
  345. if e := item.Update(updateCols); e != nil {
  346. errMsg = "更新提问信息失败"
  347. err = errors.New("更新提问信息失败, Err:" + e.Error())
  348. }
  349. return
  350. }
  351. // CheckCommunityQuestionPermission 查询当前操作用户是否运营管理员权限
  352. func CheckCommunityQuestionPermission(adminId int) (errMsg string, err error) {
  353. roleInfo, e := sys_role.GetSysRoleByRoleTypeCode("yb_question_admin")
  354. if e != nil {
  355. errMsg = "角色信息有误"
  356. if e.Error() == utils.ErrNoRow() {
  357. err = errors.New("角色不存在, Err: " + e.Error())
  358. return
  359. }
  360. err = errors.New("角色信息有误, Err: " + e.Error())
  361. return
  362. }
  363. _, e = sys_role_admin.GetRoleIdsByAdminIdRoleId(adminId, roleInfo.RoleId)
  364. if e != nil {
  365. errMsg = "无权操作"
  366. err = errors.New("无权操作, Err: " + e.Error())
  367. return
  368. }
  369. return
  370. }