checksearchlogic.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package logic
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. IC "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXBase/rpc/init"
  5. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXBase/rpc/util"
  6. "bytes"
  7. "context"
  8. "crypto/md5"
  9. "fmt"
  10. "log"
  11. "net/url"
  12. "sort"
  13. "strings"
  14. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXBase/rpc/bxbase"
  15. "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXBase/rpc/internal/svc"
  16. "github.com/zeromicro/go-zero/core/logx"
  17. )
  18. type CheckSearchLogic struct {
  19. ctx context.Context
  20. svcCtx *svc.ServiceContext
  21. logx.Logger
  22. }
  23. func NewCheckSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckSearchLogic {
  24. return &CheckSearchLogic{
  25. ctx: ctx,
  26. svcCtx: svcCtx,
  27. Logger: logx.WithContext(ctx),
  28. }
  29. }
  30. // 校验搜索列表
  31. func (l *CheckSearchLogic) CheckSearch(in *bxbase.AddSearchReq) (res *bxbase.CheckRes, err error) {
  32. res = new(bxbase.CheckRes)
  33. if in.UserId == "" {
  34. res.ErrCode = 1
  35. res.ErrMsg = "用户未登录"
  36. return
  37. }
  38. if in.Keywords == "" && in.AdditionalWords == "" && in.Industry == "" && in.Winner == "" && in.Agency == "" && in.Buyer == "" {
  39. res.ErrCode = 1
  40. res.ErrMsg = "请先输入关键词或选择行业"
  41. return
  42. }
  43. log.Println("校验搜索列表:", in)
  44. in.Keywords = strings.Replace(in.Keywords, " ", ",", -1)
  45. query := map[string]interface{}{
  46. "user_id": in.UserId,
  47. }
  48. if in.BidField != "" {
  49. query["bidField"] = in.BidField
  50. } else {
  51. query["bidField"] = map[string]interface{}{
  52. "$exists": false,
  53. }
  54. }
  55. if IC.Mgo.Count("search_condition", query) >= 10 {
  56. res.ErrCode = 1
  57. res.ErrMsg = "对不起,最多可保存10个筛选条件。"
  58. return
  59. }
  60. in.Keywords = ValueSort(in.Keywords)
  61. in.Area = ValueSort(in.Area)
  62. in.City = ValueSort(in.City)
  63. in.Buyer = ValueSort(in.Buyer)
  64. in.Winner = ValueSort(in.Winner)
  65. in.Agency = ValueSort(in.Agency)
  66. in.Subtype = ValueSort(in.Subtype)
  67. in.Industry = ValueSort(in.Industry)
  68. in.SelectType = ValueSort(in.SelectType)
  69. in.BuyerClass = ValueSort(in.BuyerClass)
  70. in.NotKey = ValueSort(in.NotKey)
  71. in.AdditionalWords = ValueSort(in.AdditionalWords)
  72. //区域处理成字符串数组
  73. // 搜索分组为 1-招标采购公告时 2 超前项目
  74. // 当所选择的信息类型是全选时,需要处理成和全部时一样的空串
  75. switch in.SearchGroup {
  76. case util.SearchGroupBidding:
  77. if ValueSort(util.TopTypesBidding) == in.Subtype {
  78. in.Subtype = ""
  79. }
  80. case util.SearchGroupLeadingProject:
  81. if ValueSort(util.TopTypesLeadingProject) == in.Subtype {
  82. in.Subtype = ""
  83. }
  84. case util.SearchGroupAnnouncementProject:
  85. if in.Subtype == "" {
  86. in.Subtype = "招标公告"
  87. }
  88. case util.SearchGroupForetellProject:
  89. if in.Subtype == "" {
  90. in.Subtype = "招标预告"
  91. }
  92. case util.SearchGroupResultProject:
  93. if in.Subtype == "" {
  94. in.Subtype = "招标结果"
  95. }
  96. }
  97. inMap := common.StructToMapMore(in)
  98. delete(inMap, "searchGroup")
  99. var areaArr []string
  100. for k, v := range in.RegionMap {
  101. if v.Area == nil {
  102. areaArr = append(areaArr, fmt.Sprintf("%s_%s_%s", k, "", ""))
  103. continue
  104. }
  105. for k1, v1 := range v.Area {
  106. if len(v1.District) == 0 {
  107. areaArr = append(areaArr, fmt.Sprintf("%s_%s_%s", k, k1, ""))
  108. continue
  109. }
  110. for _, v2 := range v1.District {
  111. areaArr = append(areaArr, fmt.Sprintf("%s_%s_%s", k, k1, v2))
  112. }
  113. }
  114. }
  115. log.Println(areaArr)
  116. if in.BidField != "" {
  117. inMap["bidField"] = in.BidField
  118. }
  119. inMap["regionMap"] = ValueSort(strings.Join(areaArr, ","))
  120. inKey := GetKeysByParam(inMap)
  121. query["in_key"] = inKey
  122. res.Data = inKey
  123. if IC.Mgo.Count("search_condition", query) > 0 {
  124. res.ErrCode = 1
  125. res.ErrMsg = "该条件已保存,无需重复添加。"
  126. }
  127. return
  128. }
  129. func ValueSort(v string) string {
  130. vs := strings.Split(v, ",")
  131. sort.Slice(vs, func(i, j int) bool {
  132. return vs[i] < vs[j]
  133. })
  134. return strings.Join(vs, ",")
  135. }
  136. func ValueStringsSort(arr []string) []string {
  137. sort.Slice(arr, func(i, j int) bool {
  138. return arr[i] < arr[j]
  139. })
  140. return arr
  141. }
  142. func GetKeysByParam(param map[string]interface{}) string {
  143. ps := &paramSorter{[]string{}, []string{}}
  144. for k, v := range param {
  145. ps.Keys = append(ps.Keys, k)
  146. ps.Values = append(ps.Values, common.InterfaceToStr(v))
  147. }
  148. ps.Sort()
  149. reqStr := ps.String()
  150. str := percentEncode(reqStr)
  151. str = SP(str, "%3A", "%253A", -1)
  152. return MD5(str)
  153. }
  154. func MD5(str string) string {
  155. data := []byte(str)
  156. has := md5.Sum(data)
  157. md5str := fmt.Sprintf("%x", has)
  158. return md5str
  159. }
  160. var SP = strings.Replace
  161. func percentEncode(str string) string {
  162. str = url.QueryEscape(str)
  163. str = SP(SP(SP(str, "+", "%20", -1), "*", "%2A", -1), "%7E", "~", -1)
  164. return str
  165. }
  166. type paramSorter struct {
  167. Keys []string
  168. Values []string
  169. }
  170. func (ps *paramSorter) String() string {
  171. str := ""
  172. for n, k := range ps.Keys {
  173. str += k + "=" + ps.Values[n]
  174. if n < len(ps.Keys)-1 {
  175. str += "&"
  176. }
  177. }
  178. return str
  179. }
  180. func (ps *paramSorter) Sort() {
  181. sort.Sort(ps)
  182. }
  183. func (ps *paramSorter) Len() int {
  184. return len(ps.Values)
  185. }
  186. func (ps *paramSorter) Less(i, j int) bool {
  187. return bytes.Compare([]byte(ps.Keys[i]), []byte(ps.Keys[j])) < 0
  188. }
  189. func (ps *paramSorter) Swap(i, j int) {
  190. ps.Values[i], ps.Values[j] = ps.Values[j], ps.Values[i]
  191. ps.Keys[i], ps.Keys[j] = ps.Keys[j], ps.Keys[i]
  192. }