|
@@ -2,7 +2,10 @@ package matcher
|
|
|
|
|
|
import (
|
|
|
"strings"
|
|
|
+ "sync"
|
|
|
|
|
|
+ util "app.yhyue.com/moapp/jybase/common"
|
|
|
+ "app.yhyue.com/moapp/jybase/logger"
|
|
|
. "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
|
|
|
)
|
|
|
|
|
@@ -28,8 +31,66 @@ func NewPayUser() *PayUser {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//遍历数据
|
|
|
+func (p *PayUser) Match(poolSize int, datas *[]map[string]interface{}) (*map[*UserInfo]*SortList, *map[*UserInfo]*[]string) {
|
|
|
+ defer util.Catch()
|
|
|
+ logger.Info("开始匹配数据。。。")
|
|
|
+ userMap := map[*UserInfo]*SortList{}
|
|
|
+ projectUserMap := map[*UserInfo]*[]string{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ var index int
|
|
|
+ matchPool := make(chan bool, poolSize)
|
|
|
+ matchWaitGroup := &sync.WaitGroup{}
|
|
|
+ for _, temp := range *datas {
|
|
|
+ matchPool <- true
|
|
|
+ matchWaitGroup.Add(1)
|
|
|
+ go func(info map[string]interface{}) {
|
|
|
+ defer util.Catch()
|
|
|
+ defer func() {
|
|
|
+ matchWaitGroup.Done()
|
|
|
+ <-matchPool
|
|
|
+ }()
|
|
|
+ users, projectUsers := p.ToMatch(&info)
|
|
|
+ lock.Lock()
|
|
|
+ defer lock.Unlock()
|
|
|
+ if users != nil && len(*users) > 0 {
|
|
|
+ for k, v := range *users {
|
|
|
+ l := userMap[k]
|
|
|
+ if l == nil {
|
|
|
+ l = &SortList{}
|
|
|
+ }
|
|
|
+ *l = append(*l, &MatchInfo{
|
|
|
+ Info: &info,
|
|
|
+ Keys: v.Keys,
|
|
|
+ Items: v.Items,
|
|
|
+ MatchWays: v.MatchWays,
|
|
|
+ })
|
|
|
+ userMap[k] = l
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if projectUsers != nil && len(*projectUsers) > 0 {
|
|
|
+ for _, v := range *projectUsers {
|
|
|
+ l := projectUserMap[v]
|
|
|
+ if l == nil {
|
|
|
+ l = &[]string{}
|
|
|
+ }
|
|
|
+ *l = append(*l, util.ObjToString(info["_id"]))
|
|
|
+ projectUserMap[v] = l
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }(temp)
|
|
|
+ index++
|
|
|
+ if index%500 == 0 {
|
|
|
+ logger.Info("匹配数据", index)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ matchWaitGroup.Wait()
|
|
|
+ logger.Info("匹配数据结束。。。", index)
|
|
|
+ return &userMap, &projectUserMap
|
|
|
+}
|
|
|
+
|
|
|
//
|
|
|
-func (p *PayUser) Match(info *map[string]interface{}) (*map[*UserInfo]*MatchUser, *[]*UserInfo) {
|
|
|
+func (p *PayUser) ToMatch(info *map[string]interface{}) (*map[*UserInfo]*MatchUser, *[]*UserInfo) {
|
|
|
buyerclass, _ := (*info)["buyerclass"].(string)
|
|
|
area, _ := (*info)["area"].(string)
|
|
|
if area == "全国" {
|