util.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package util
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. . "subrecommend/config"
  10. . "app.yhyue.com/moapp/jybase/common"
  11. "app.yhyue.com/moapp/jybase/logger"
  12. "app.yhyue.com/moapp/jybase/redis"
  13. )
  14. //tp 0:企业-商机管理 2:企业-超级订阅/大会员 3:企业-免费 -1:个人-免费 -2:个人-超级订阅 -3:个人-大会员
  15. func ChangeUserObj(userObj map[string]interface{}, tp int) bool {
  16. subSetKey := ""
  17. if tp > 0 {
  18. subSetKey = "o_entniche"
  19. } else if tp == -1 {
  20. subSetKey = "o_jy"
  21. } else if tp == -2 {
  22. subSetKey = "o_vipjy"
  23. } else if tp == -3 {
  24. subSetKey = "o_member_jy"
  25. }
  26. obj, _ := userObj[subSetKey].(map[string]interface{})
  27. if tp == 3 || tp == -1 {
  28. a_key, _ := obj["a_key"].([]interface{})
  29. new_a_key := proccessKey(a_key)
  30. if len(new_a_key) == 0 {
  31. return false
  32. }
  33. obj["a_key"] = new_a_key
  34. } else {
  35. new_a_items := []interface{}{}
  36. a_items, _ := obj["a_items"].([]interface{})
  37. for _, item := range a_items {
  38. item_map, _ := item.(map[string]interface{})
  39. a_key, _ := item_map["a_key"].([]interface{})
  40. if new_a_key := proccessKey(a_key); len(new_a_key) > 0 {
  41. item_map["a_key"] = new_a_key
  42. new_a_items = append(new_a_items, item_map)
  43. }
  44. }
  45. if len(new_a_items) == 0 {
  46. return false
  47. }
  48. obj["a_items"] = new_a_items
  49. }
  50. userObj[subSetKey] = obj
  51. return true
  52. }
  53. func proccessKey(a_key []interface{}) []map[string]interface{} {
  54. new_a_key := []map[string]interface{}{}
  55. for _, v := range a_key {
  56. vm, _ := v.(map[string]interface{})
  57. key, _ := vm["key"].([]interface{})
  58. appendkey, _ := vm["appendkey"].([]interface{})
  59. key = append(key, appendkey...)
  60. args := []string{}
  61. for _, vv := range key {
  62. vvs, _ := vv.(string)
  63. vvs = strings.TrimSpace(vvs)
  64. if vvs == "" {
  65. continue
  66. }
  67. for _, vvv := range strings.Split(vvs, "+") {
  68. vvv = strings.TrimSpace(vvv)
  69. if vvv == "" {
  70. continue
  71. }
  72. args = append(args, vvv)
  73. }
  74. }
  75. if len(args) > 0 {
  76. if Int64All(vm["matchway"]) == 0 {
  77. if likeWord := GetLikeWord(args); len(likeWord) > 0 {
  78. delete(vm, "appendkey")
  79. vm["key"] = likeWord
  80. new_a_key = append(new_a_key, vm)
  81. }
  82. } else {
  83. newLikeWord := []string{}
  84. for _, arg := range args {
  85. if likeWord := GetLikeWord([]string{arg}); len(likeWord) > 0 {
  86. newLikeWord = append(newLikeWord, likeWord...)
  87. }
  88. }
  89. if len(newLikeWord) > 0 {
  90. delete(vm, "appendkey")
  91. vm["key"] = newLikeWord
  92. new_a_key = append(new_a_key, vm)
  93. }
  94. }
  95. }
  96. }
  97. return new_a_key
  98. }
  99. //获取相似词
  100. func GetLikeWord(keys []string) []string {
  101. redisKey := fmt.Sprintf("subLikeKey_%s", strings.Join(keys, "+"))
  102. b, err := redis.GetNewBytes("pushcache_2_d", redisKey)
  103. if err != nil {
  104. logger.Error(err)
  105. } else if b != nil {
  106. var array []string
  107. if err = json.Unmarshal(*b, &array); err != nil {
  108. logger.Error(err)
  109. } else {
  110. return array
  111. }
  112. }
  113. // 构建请求的 JSON 数据
  114. jsonData, err := json.Marshal(map[string]interface{}{
  115. "keywords": keys,
  116. "topN": len(keys),
  117. })
  118. if err != nil {
  119. logger.Error(err)
  120. return nil
  121. }
  122. // 发起 POST 请求
  123. resp, err := http.Post(Config.RecomRul, "application/json", bytes.NewBuffer(jsonData))
  124. if err != nil {
  125. logger.Error(err)
  126. return nil
  127. }
  128. defer resp.Body.Close()
  129. // 读取响应内容
  130. body, err := ioutil.ReadAll(resp.Body)
  131. if err != nil {
  132. logger.Error(err)
  133. return nil
  134. }
  135. // 打印响应内容
  136. //{"status": 200, "result": [["智能交通", 0.939007580280304], ["智能城市", 0.8879148364067078], ["车路协同", 0.859275758266449], ["智慧园区", 0.8444814085960388], ["智能驾驶", 0.832817018032074], ["自动驾驶", 0.832410454750061], ["智慧出行", 0.8308652639389038], ["智慧城市建设", 0.8303624391555786], ["数字城市", 0.8295241594314575], ["智慧物流", 0.8250287771224976], ["智能网联汽车", 0.8246825933456421], ["智慧城市管理", 0.822432279586792], ["智慧安防", 0.8221968412399292], ["智慧医疗", 0.818789541721344], ["城市智能", 0.8181037306785583], ["城市智慧交通", 0.8168191313743591], ["城市安防", 0.8149634003639221], ["物联网", 0.8149363994598389], ["无人驾驶技术", 0.8141185641288757], ["智能汽车", 0.8126631379127502], ["智慧道路", 0.8092268705368042], ["智能城市建设", 0.80910724401474], ["汽车自动驾驶", 0.8075457811355591], ["智慧交通系统", 0.8069972991943359], ["城市大脑", 0.8067115545272827], ["智能网联", 0.8041828870773315], ["智慧停车", 0.8037421703338623], ["智能物流", 0.8029360771179199], ["数字交通", 0.8018928170204163], ["无人驾驶汽车", 0.8017951846122742]]}
  137. var r struct {
  138. Status int
  139. Result []interface{}
  140. }
  141. if err := json.Unmarshal(body, &r); err != nil {
  142. logger.Error(err)
  143. return nil
  144. }
  145. array := []string{}
  146. for _, v := range r.Result {
  147. if vv, _ := v.([]interface{}); len(vv) >= 2 && Float64All(vv[1]) > Config.Similarity {
  148. if vvv, _ := vv[0].(string); vvv != "" {
  149. array = append(array, vvv)
  150. }
  151. }
  152. }
  153. redis.PutCKV("pushcache_2_d", redisKey, array)
  154. return array
  155. }