main.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package main
  2. import (
  3. "encoding/json"
  4. "mongodb"
  5. "qfw/util"
  6. "qfw/util/redis"
  7. "sort"
  8. "strings"
  9. "sync"
  10. )
  11. var (
  12. MongoTool *mongodb.MongodbSim
  13. )
  14. func init() {
  15. MongoTool = &mongodb.MongodbSim{
  16. MongodbAddr: "172.17.4.85:27080",
  17. Size: 10,
  18. DbName: "qfw",
  19. }
  20. MongoTool.InitPool()
  21. redis.InitRedis("qyxy_winner=127.0.0.1:6379")
  22. }
  23. func main() {
  24. sess := MongoTool.GetMgoConn()
  25. defer MongoTool.DestoryMongoConn(sess)
  26. ch := make(chan bool, 10)
  27. wg := &sync.WaitGroup{}
  28. //q := map[string]interface{}{
  29. // "_id": map[string]interface{}{
  30. // "$gte": mongodb.StringTOBsonId("5c2a3d000000000000000000"),
  31. // "$lte": mongodb.StringTOBsonId("5e0a1f000000000000000000"),
  32. // },
  33. //}
  34. field := map[string]interface{}{"agency": 1, "buyer": 1, "s_winner": 1, "projectname": 1, "purchasing": 1,
  35. "area": 1}
  36. query := sess.DB("qfw").C("project").Find(nil).Select(field).Iter()
  37. count := 0
  38. for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
  39. if count%2000 == 0 {
  40. util.Debug("current ---", count)
  41. }
  42. ch <- true
  43. wg.Add(1)
  44. go func(tmp map[string]interface{}) {
  45. defer func() {
  46. <-ch
  47. wg.Done()
  48. }()
  49. taskinfo(tmp)
  50. }(tmp)
  51. tmp = make(map[string]interface{})
  52. }
  53. wg.Wait()
  54. util.Debug("over ---", count)
  55. }
  56. func taskinfo(tmp map[string]interface{}) {
  57. winners := strings.Split(util.ObjToString(tmp["s_winner"]), ",")
  58. for _, v := range winners{
  59. winnermap := make(map[string]interface{})
  60. if b, err := redis.Exists("qyxy_winner", v); err == nil && b {
  61. text := redis.GetStr("qyxy_winner", v)
  62. err1 := json.Unmarshal([]byte(text), &winnermap)
  63. if err1 != nil {
  64. util.Debug(v, "winner-----map解析异常")
  65. }
  66. // bid_projectname
  67. pname := util.ObjToString(tmp["projectname"])
  68. if pname != "" {
  69. if winnermap["bid_projectname"] != nil {
  70. arr := winnermap["bid_projectname"].([]interface{})
  71. pnameArr := util.ObjArrToStringArr(arr)
  72. if BinarySearch(pnameArr, util.ObjToString(tmp["projectname"])) == -1 {
  73. pnameArr = append(pnameArr, util.ObjToString(tmp["projectname"]))
  74. }
  75. winnermap["bid_projectname"] = pnameArr
  76. }else {
  77. pname := []string{util.ObjToString(tmp["projectname"])}
  78. winnermap["bid_projectname"] = pname
  79. }
  80. }
  81. // bid_purchasing
  82. if util.ObjToString(tmp["purchasing"]) != "" {
  83. if winnermap["bid_purchasing"] != nil {
  84. arr := winnermap["bid_purchasing"].([]interface{})
  85. purs := util.ObjArrToStringArr(arr)
  86. if BinarySearch(purs, util.ObjToString(tmp["purchasing"])) == -1 {
  87. purs = append(purs, util.ObjToString(tmp["purchasing"]))
  88. }
  89. winnermap["bid_purchasing"] = purs
  90. }else {
  91. purs := []string{util.ObjToString(tmp["purchasing"])}
  92. winnermap["bid_purchasing"] = purs
  93. }
  94. }
  95. // bid_area
  96. if winnermap["bid_area"] != nil {
  97. arr := winnermap["bid_area"].([]interface{})
  98. areas := util.ObjArrToStringArr(arr)
  99. if BinarySearch(areas, util.ObjToString(tmp["area"])) == -1 {
  100. areas = append(areas, util.ObjToString(tmp["area"]))
  101. }
  102. winnermap["bid_area"] = areas
  103. }else {
  104. areas := []string{util.ObjToString(tmp["area"])}
  105. winnermap["bid_area"] = areas
  106. }
  107. // bid_unittype
  108. if winnermap["bid_unittype"] != nil {
  109. arr := winnermap["bid_unittype"].([]interface{})
  110. types := util.ObjArrToStringArr(arr)
  111. if BinarySearch(types, "2") == -1 {
  112. types = append(types, "2")
  113. }
  114. winnermap["bid_unittype"] = types
  115. }else {
  116. types := []string{"2"}
  117. winnermap["bid_unittype"] = types
  118. }
  119. }else {
  120. // bid_projectname
  121. if tmp["projectname"] != nil && tmp["projectname"] != "" {
  122. winnermap["bid_projectname"] = []string{util.ObjToString(tmp["projectname"])}
  123. }
  124. // bid_purchasing
  125. if tmp["purchasing"] != nil && tmp["purchasing"] != "" {
  126. winnermap["bid_purchasing"] = strings.Split(util.ObjToString(tmp["purchasing"]), ",")
  127. }
  128. // bid_area
  129. winnermap["bid_area"] = []string{util.ObjToString(tmp["area"])}
  130. // bid_unittype
  131. winnermap["bid_unittype"] = []string{"2"}
  132. }
  133. if len(winnermap) > 0 {
  134. data , _ := json.Marshal(winnermap)
  135. redis.Put("qyxy_winner", v, string(data), 0)
  136. }
  137. }
  138. if buyer := util.ObjToString(tmp["buyer"]); buyer != "" {
  139. buyermap := make(map[string]interface{})
  140. if b, err := redis.Exists("qyxy_winner", buyer); err == nil && b {
  141. text := redis.GetStr("qyxy_winner", buyer)
  142. err1 := json.Unmarshal([]byte(text), &buyermap)
  143. if err1 != nil {
  144. util.Debug(buyer, "buyer-----map解析异常")
  145. }
  146. // bid_unittype
  147. if buyermap["bid_unittype"] != nil {
  148. arr := buyermap["bid_unittype"].([]interface{})
  149. types := util.ObjArrToStringArr(arr)
  150. if BinarySearch(types, "2") == -1 {
  151. types = append(types, "2")
  152. }
  153. buyermap["bid_unittype"] = types
  154. }else {
  155. types := []string{"1"}
  156. buyermap["bid_unittype"] = types
  157. }
  158. }else {
  159. buyermap["bid_unittype"] = []string{"1"}
  160. }
  161. if len(buyermap) > 0 {
  162. data , _ := json.Marshal(buyermap)
  163. redis.Put("qyxy_winner", buyer, string(data), 0)
  164. }
  165. }
  166. if agency := util.ObjToString(tmp["agency"]); agency != "" {
  167. agencymap := make(map[string]interface{})
  168. if b, err := redis.Exists("qyxy_winner", agency); err == nil && b {
  169. text := redis.GetStr("qyxy_winner", agency)
  170. err1 := json.Unmarshal([]byte(text), &agencymap)
  171. if err1 != nil {
  172. util.Debug(agency, "agency----map解析异常")
  173. }
  174. // bid_unittype
  175. if agencymap["bid_unittype"] != nil {
  176. arr := agencymap["bid_unittype"].([]interface{})
  177. types := util.ObjArrToStringArr(arr)
  178. if BinarySearch(types, "3") == -1 {
  179. types = append(types, "3")
  180. }
  181. agencymap["bid_unittype"] = types
  182. }else {
  183. types := []string{"3"}
  184. agencymap["bid_unittype"] = types
  185. }
  186. }else {
  187. agencymap["bid_unittype"] = []string{"3"}
  188. }
  189. if len(agencymap) > 0 {
  190. data , _ := json.Marshal(agencymap)
  191. redis.Put("qyxy_winner", agency, string(data), 0)
  192. }
  193. }
  194. }
  195. func BinarySearch(s []string, k string) int {
  196. sort.Strings(s)
  197. lo, hi := 0, len(s)-1
  198. for lo <= hi {
  199. m := (lo + hi) >> 1
  200. if s[m] < k {
  201. lo = m + 1
  202. } else if s[m] > k {
  203. hi = m - 1
  204. } else {
  205. return m
  206. }
  207. }
  208. return -1
  209. }