day_new.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/silenceper/wechat/v2/work/msgaudit"
  7. "hongze/hongze_open_api/models/tables/day_new"
  8. "hongze/hongze_open_api/services/alarm_msg"
  9. "hongze/hongze_open_api/services/wework"
  10. "hongze/hongze_open_api/utils"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. func DayNewWeworkMsgRefresh() (err error) {
  16. cacheKey := utils.CACHE_KEY_DAYNEW_REFRESH
  17. //设置redis 防止频繁操作
  18. if !utils.Rc.SetNX(cacheKey, 1, 1*time.Minute) {
  19. err = errors.New(fmt.Sprintf("系统处理中,请1分钟之后再试"))
  20. return
  21. }
  22. defer func() {
  23. if err != nil {
  24. go alarm_msg.SendAlarmMsg("企业微信 会议存档消息刷新失败, Err:"+err.Error(), 1)
  25. }
  26. }()
  27. list := make([]msgaudit.TextMessage, 0)
  28. //获取最新的拉取日志,得到seq和limit的值
  29. lastReq, e := day_new.GetLasReqLog()
  30. if e != nil && e.Error() != utils.ErrNoRow() {
  31. err = errors.New(fmt.Sprintf("获取最新请求日志失败 err: %v", e))
  32. return
  33. }
  34. now := time.Now()
  35. seq := uint64(0)
  36. limit := uint64(100)
  37. timeout := 5
  38. seqRes := uint64(0)
  39. if e == nil {
  40. seq = lastReq.Seq
  41. limit = uint64(lastReq.Limit)
  42. }
  43. msgAuditClient := wework.NewWeWorkMsgAuditClient()
  44. list, seqRes, err = msgAuditClient.GetMsgAuditContent(seq, limit, timeout)
  45. if err != nil {
  46. err = errors.New(fmt.Sprintf("查询会话存档信息失败 err: %v", err))
  47. return
  48. }
  49. if len(list) == 0 { //本次无消息更新
  50. return
  51. }
  52. //查询5天内的消息,用来判断消息是否已存在
  53. before5Time := time.Now().Add(-120*time.Hour).Unix() * 1000
  54. cond := " and msg_time > ?"
  55. var pars []interface{}
  56. pars = append(pars, before5Time)
  57. existList, err := day_new.GetWeworkMsgByCondition(cond, pars)
  58. if err != nil {
  59. return
  60. }
  61. existMsgMap := make(map[string]struct{}, 0)
  62. for _, v := range existList {
  63. existMsgMap[v.MsgId] = struct{}{}
  64. }
  65. //如果成功获取到值,则新增一条新的请求日志,是否需要加入事务,防止请求成功后,数据没有正常插入引起
  66. userMap := make(map[string]struct{}, 0) //企业内用户
  67. extendUserMap := make(map[string]struct{}, 0) //企业外联系人
  68. insertList := make([]*day_new.WeworkMsg, 0)
  69. for _, v := range list {
  70. if _, ok := existMsgMap[v.MsgID]; ok {
  71. continue
  72. }
  73. toList, _ := json.Marshal(v.ToList)
  74. v.ToList = append(v.ToList, v.From) //把发言者的userid也加入到用户map里
  75. for _, u := range v.ToList {
  76. if len(u) > 10 && strings.HasPrefix(u, "wm") {
  77. if _, ok := extendUserMap[u]; !ok {
  78. extendUserMap[u] = struct{}{}
  79. }
  80. }else{
  81. if _, ok := userMap[u]; !ok {
  82. userMap[u] = struct{}{}
  83. }
  84. }
  85. }
  86. tmp := &day_new.WeworkMsg{
  87. MsgId: v.MsgID,
  88. Action: v.Action,
  89. From: v.From,
  90. ToList: string(toList),
  91. RoomId: v.RoomID,
  92. MsgTime: v.MsgTime,
  93. MsgType: v.MsgType,
  94. Content: v.Text.Content,
  95. ContentEn: "",
  96. ReportId: 0,
  97. CreateTime: now,
  98. IsAdd: 0,
  99. IsDelete: 0,
  100. ModifyTime: now,
  101. }
  102. insertList = append(insertList, tmp)
  103. }
  104. //批量插入数据库
  105. err = day_new.AddWeworkMsgMulti(insertList)
  106. if err != nil {
  107. err = errors.New(fmt.Sprintf("批量新增模版消息失败 err: %v", err))
  108. return
  109. }
  110. reqLog := &day_new.WeworkMsgLog{
  111. Seq: seqRes,
  112. Limit: int(limit),
  113. Total: len(list),
  114. ReqResult: int8(1),
  115. CreateTime: now,
  116. ModifyTime: now,
  117. }
  118. err = day_new.AddMsgReqLog(reqLog)
  119. if err != nil {
  120. err = errors.New(fmt.Sprintf("新增请求日志失败 err: %v", err))
  121. return
  122. }
  123. //批量插入用户信息
  124. //查询已有的用户信息,判断是否需要新增
  125. allUsers, err := day_new.GetAllWeworkUser()
  126. if err != nil {
  127. err = errors.New(fmt.Sprintf("查询所有企业微信用户失败 err: %v", err))
  128. return
  129. }
  130. insertUserList := make([]*day_new.WeworkUser, 0)
  131. userExistMap := make(map[string]struct{}, 0) //企业内用户
  132. extendUseExistrMap := make(map[string]struct{}, 0) //企业外联系人
  133. for _, v := range allUsers {
  134. if v.WwExtendUserId != "" {
  135. extendUseExistrMap[v.WwExtendUserId] = struct{}{}
  136. }
  137. if v.WwUserId != "" {
  138. userExistMap[v.WwUserId] = struct{}{}
  139. }
  140. }
  141. for k := range extendUserMap {
  142. if _, ok := extendUseExistrMap[k]; !ok {
  143. tmp := &day_new.WeworkUser{
  144. WwUserId: "",
  145. WwExtendUserId: k,
  146. WwNickName: "",
  147. WwDeptId: 0,
  148. CreateTime: now,
  149. ModifyTime: now,
  150. }
  151. insertUserList = append(insertUserList, tmp)
  152. }
  153. }
  154. for k := range userMap {
  155. if _, ok := userExistMap[k]; !ok {
  156. tmp := &day_new.WeworkUser{
  157. WwUserId: k,
  158. WwExtendUserId: "",
  159. WwNickName: "",
  160. WwDeptId: 0,
  161. CreateTime: now,
  162. ModifyTime: now,
  163. }
  164. insertUserList = append(insertUserList, tmp)
  165. }
  166. }
  167. if len(insertUserList) > 0 {
  168. err = day_new.AddWeworkUserMulti(insertUserList)
  169. if err != nil {
  170. err = errors.New(fmt.Sprintf("新增企业微信用户失败 err: %v", err))
  171. return
  172. }
  173. }
  174. //批量翻译
  175. go DayNewTranslateContent()
  176. go GetWeWorkUsersNickName()
  177. return
  178. }
  179. func GetWeWorkUsersNickName() (err error) {
  180. defer func() {
  181. if err != nil {
  182. go alarm_msg.SendAlarmMsg("企业微信 查询用户昵称失败, Err:"+err.Error(), 1)
  183. }
  184. }()
  185. //查询没有昵称的用户库,循环调用查询昵称接口
  186. users, err := day_new.GetEmptyNickNameWeworkUser()
  187. if err != nil {
  188. return
  189. }
  190. if len(users) == 0{
  191. return
  192. }
  193. multi := ""
  194. needChangeIds := ""
  195. client := wework.NewWeWorkUserNameClient()
  196. ExtendClient := wework.NewWeWorkExternalContactClient()
  197. //设置批量更新
  198. for _, v := range users {
  199. if v.WwUserId != "" {
  200. ret, e := client.GetUser(v.WwUserId)
  201. if e != nil {
  202. err = e
  203. return
  204. }
  205. if ret.Name != "" {
  206. needChangeIds += strconv.Itoa(int(v.Id)) + ","
  207. multi += ` WHEN `+strconv.Itoa(int(v.Id))+` THEN "`+ ret.Name +`"`
  208. }
  209. }else if v.WwExtendUserId != "" {
  210. // todo 获取外部联系人姓名
  211. ret1, e := ExtendClient.GetExternalContact(v.WwExtendUserId)
  212. if e != nil {
  213. err = e
  214. return
  215. }
  216. if ret1.ExternalContact.Name != "" {
  217. needChangeIds += strconv.Itoa(int(v.Id)) + ","
  218. multi += ` WHEN `+strconv.Itoa(int(v.Id))+` THEN "`+ ret1.ExternalContact.Name +`"`
  219. }
  220. }
  221. }
  222. if needChangeIds != "" {
  223. needChangeIds = strings.Trim(needChangeIds, ",")
  224. err = day_new.MultiUpdateWeworkUserName(multi, needChangeIds)
  225. if err != nil {
  226. err = errors.New(fmt.Sprintf("更新企业微信成员姓名失败 err: %v", err))
  227. return
  228. }
  229. }
  230. return
  231. }
  232. func DayNewTranslateContent() (err error) {
  233. cacheKey := utils.CACHE_KEY_DAYNEW_TRANSLATE
  234. //设置redis 防止频繁操作,控制每分钟执行1次
  235. if !utils.Rc.SetNX(cacheKey, 1, 1*time.Minute) {
  236. err = errors.New(fmt.Sprintf("系统处理中,请1分钟之后再试"))
  237. return
  238. }
  239. defer func() {
  240. if err != nil {
  241. go alarm_msg.SendAlarmMsg("企业微信 中翻英操作失败, Err:"+err.Error(), 1)
  242. }
  243. }()
  244. //查询待翻译的内容列表
  245. condition := ` and (content_en = "" or content_en is null)`
  246. var pars []interface{}
  247. list, err := day_new.GetWeworkMsgByConditionLimit(condition, pars, 2000) //默认最多查询2000条
  248. if err != nil {
  249. err = errors.New(fmt.Sprintf("查询未翻译的聊天记录失败 err: %v", err))
  250. return
  251. }
  252. multi := ""
  253. needChangeIds := ""
  254. count := 0
  255. contentMap := make(map[string]string, 0)
  256. contentEnMap := make(map[string]string)
  257. for _, v := range list {
  258. //如果单条翻译的字符数超过1000,则直接翻译,否则批量翻译
  259. if len(v.Content) > 1000 {
  260. en, e := AliTranslate(v.Content)
  261. if e != nil {
  262. err = e
  263. return
  264. }
  265. needChangeIds += strconv.Itoa(int(v.Id)) + ","
  266. multi += ` WHEN `+strconv.Itoa(int(v.Id))+` THEN "`+ en +`"`
  267. }else{
  268. if count >= 50 { //待翻译的条数不能超过50; 单条翻译字符数不能超过1000字符
  269. contentEnMap, err = batchTranslateHandler(contentMap)
  270. if err != nil {
  271. return
  272. }
  273. // 拼接更新sql
  274. for rk, rv := range contentEnMap {
  275. needChangeIds += rk + ","
  276. multi += ` WHEN `+rk+` THEN "`+ rv +`"`
  277. }
  278. contentMap = make(map[string]string, 0)
  279. count = 0
  280. }
  281. contentMap[strconv.Itoa(int(v.Id))] = v.Content
  282. count += 1
  283. }
  284. }
  285. //剩余不满50条的content
  286. if count > 0 {
  287. contentEnMap, err = batchTranslateHandler(contentMap)
  288. if err != nil {
  289. return
  290. }
  291. // 拼接更新sql
  292. for rk, rv := range contentEnMap {
  293. needChangeIds += rk + ","
  294. multi += ` WHEN `+rk+` THEN "`+ rv +`"`
  295. }
  296. }
  297. if needChangeIds != "" {
  298. needChangeIds = strings.Trim(needChangeIds, ",")
  299. err = day_new.MultiUpdateContentEn(multi, needChangeIds)
  300. if err != nil {
  301. err = errors.New(fmt.Sprintf("更新翻译后的内容失败 err: %v", err))
  302. return
  303. }
  304. }
  305. return
  306. }
  307. func batchTranslateHandler(contentMap map[string]string) (contentEnMap map[string]string, err error) {
  308. bytes,_ := json.Marshal(contentMap)
  309. content := string(bytes)
  310. en, err := AliTranslate(content)
  311. if err != nil {
  312. return
  313. }
  314. //json转为map数据结构
  315. err = json.Unmarshal([]byte(en), &contentEnMap)
  316. return
  317. }