123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- package main
- import (
- "encoding/json"
- "mongodb"
- "qfw/util"
- "qfw/util/redis"
- "sort"
- "strings"
- "sync"
- )
- var (
- MongoTool *mongodb.MongodbSim
- )
- func init() {
- MongoTool = &mongodb.MongodbSim{
- MongodbAddr: "172.17.4.85:27080",
- Size: 10,
- DbName: "qfw",
- }
- MongoTool.InitPool()
- redis.InitRedis("qyxy_winner=127.0.0.1:6379")
- }
- func main() {
- sess := MongoTool.GetMgoConn()
- defer MongoTool.DestoryMongoConn(sess)
- ch := make(chan bool, 10)
- wg := &sync.WaitGroup{}
- //q := map[string]interface{}{
- // "_id": map[string]interface{}{
- // "$gte": mongodb.StringTOBsonId("5c2a3d000000000000000000"),
- // "$lte": mongodb.StringTOBsonId("5e0a1f000000000000000000"),
- // },
- //}
- field := map[string]interface{}{"agency": 1, "buyer": 1, "s_winner": 1, "projectname": 1, "purchasing": 1,
- "area": 1}
- query := sess.DB("qfw").C("project").Find(nil).Select(field).Iter()
- count := 0
- for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
- if count%2000 == 0 {
- util.Debug("current ---", count)
- }
- ch <- true
- wg.Add(1)
- go func(tmp map[string]interface{}) {
- defer func() {
- <-ch
- wg.Done()
- }()
- taskinfo(tmp)
- }(tmp)
- tmp = make(map[string]interface{})
- }
- wg.Wait()
- util.Debug("over ---", count)
- }
- func taskinfo(tmp map[string]interface{}) {
- winners := strings.Split(util.ObjToString(tmp["s_winner"]), ",")
- for _, v := range winners{
- winnermap := make(map[string]interface{})
- if b, err := redis.Exists("qyxy_winner", v); err == nil && b {
- text := redis.GetStr("qyxy_winner", v)
- err1 := json.Unmarshal([]byte(text), &winnermap)
- if err1 != nil {
- util.Debug(v, "winner-----map解析异常")
- }
- // bid_projectname
- pname := util.ObjToString(tmp["projectname"])
- if pname != "" {
- if winnermap["bid_projectname"] != nil {
- arr := winnermap["bid_projectname"].([]interface{})
- pnameArr := util.ObjArrToStringArr(arr)
- if BinarySearch(pnameArr, util.ObjToString(tmp["projectname"])) == -1 {
- pnameArr = append(pnameArr, util.ObjToString(tmp["projectname"]))
- }
- winnermap["bid_projectname"] = pnameArr
- }else {
- pname := []string{util.ObjToString(tmp["projectname"])}
- winnermap["bid_projectname"] = pname
- }
- }
- // bid_purchasing
- if util.ObjToString(tmp["purchasing"]) != "" {
- if winnermap["bid_purchasing"] != nil {
- arr := winnermap["bid_purchasing"].([]interface{})
- purs := util.ObjArrToStringArr(arr)
- if BinarySearch(purs, util.ObjToString(tmp["purchasing"])) == -1 {
- purs = append(purs, util.ObjToString(tmp["purchasing"]))
- }
- winnermap["bid_purchasing"] = purs
- }else {
- purs := []string{util.ObjToString(tmp["purchasing"])}
- winnermap["bid_purchasing"] = purs
- }
- }
- // bid_area
- if winnermap["bid_area"] != nil {
- arr := winnermap["bid_area"].([]interface{})
- areas := util.ObjArrToStringArr(arr)
- if BinarySearch(areas, util.ObjToString(tmp["area"])) == -1 {
- areas = append(areas, util.ObjToString(tmp["area"]))
- }
- winnermap["bid_area"] = areas
- }else {
- areas := []string{util.ObjToString(tmp["area"])}
- winnermap["bid_area"] = areas
- }
- // bid_unittype
- if winnermap["bid_unittype"] != nil {
- arr := winnermap["bid_unittype"].([]interface{})
- types := util.ObjArrToStringArr(arr)
- if BinarySearch(types, "2") == -1 {
- types = append(types, "2")
- }
- winnermap["bid_unittype"] = types
- }else {
- types := []string{"2"}
- winnermap["bid_unittype"] = types
- }
- }else {
- // bid_projectname
- if tmp["projectname"] != nil && tmp["projectname"] != "" {
- winnermap["bid_projectname"] = []string{util.ObjToString(tmp["projectname"])}
- }
- // bid_purchasing
- if tmp["purchasing"] != nil && tmp["purchasing"] != "" {
- winnermap["bid_purchasing"] = strings.Split(util.ObjToString(tmp["purchasing"]), ",")
- }
- // bid_area
- winnermap["bid_area"] = []string{util.ObjToString(tmp["area"])}
- // bid_unittype
- winnermap["bid_unittype"] = []string{"2"}
- }
- if len(winnermap) > 0 {
- data , _ := json.Marshal(winnermap)
- redis.Put("qyxy_winner", v, string(data), 0)
- }
- }
- if buyer := util.ObjToString(tmp["buyer"]); buyer != "" {
- buyermap := make(map[string]interface{})
- if b, err := redis.Exists("qyxy_winner", buyer); err == nil && b {
- text := redis.GetStr("qyxy_winner", buyer)
- err1 := json.Unmarshal([]byte(text), &buyermap)
- if err1 != nil {
- util.Debug(buyer, "buyer-----map解析异常")
- }
- // bid_unittype
- if buyermap["bid_unittype"] != nil {
- arr := buyermap["bid_unittype"].([]interface{})
- types := util.ObjArrToStringArr(arr)
- if BinarySearch(types, "2") == -1 {
- types = append(types, "2")
- }
- buyermap["bid_unittype"] = types
- }else {
- types := []string{"1"}
- buyermap["bid_unittype"] = types
- }
- }else {
- buyermap["bid_unittype"] = []string{"1"}
- }
- if len(buyermap) > 0 {
- data , _ := json.Marshal(buyermap)
- redis.Put("qyxy_winner", buyer, string(data), 0)
- }
- }
- if agency := util.ObjToString(tmp["agency"]); agency != "" {
- agencymap := make(map[string]interface{})
- if b, err := redis.Exists("qyxy_winner", agency); err == nil && b {
- text := redis.GetStr("qyxy_winner", agency)
- err1 := json.Unmarshal([]byte(text), &agencymap)
- if err1 != nil {
- util.Debug(agency, "agency----map解析异常")
- }
- // bid_unittype
- if agencymap["bid_unittype"] != nil {
- arr := agencymap["bid_unittype"].([]interface{})
- types := util.ObjArrToStringArr(arr)
- if BinarySearch(types, "3") == -1 {
- types = append(types, "3")
- }
- agencymap["bid_unittype"] = types
- }else {
- types := []string{"3"}
- agencymap["bid_unittype"] = types
- }
- }else {
- agencymap["bid_unittype"] = []string{"3"}
- }
- if len(agencymap) > 0 {
- data , _ := json.Marshal(agencymap)
- redis.Put("qyxy_winner", agency, string(data), 0)
- }
- }
- }
- func BinarySearch(s []string, k string) int {
- sort.Strings(s)
- lo, hi := 0, len(s)-1
- for lo <= hi {
- m := (lo + hi) >> 1
- if s[m] < k {
- lo = m + 1
- } else if s[m] > k {
- hi = m - 1
- } else {
- return m
- }
- }
- return -1
- }
|