day_new.go 8.4 KB

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