main.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/tealeg/xlsx"
  6. "go.mongodb.org/mongo-driver/bson"
  7. mgo "mongodb"
  8. "os"
  9. qu "qfw/util"
  10. "sync"
  11. "time"
  12. "util"
  13. )
  14. var (
  15. Sysconfig map[string]interface{}
  16. Mgo *mgo.MongodbSim
  17. )
  18. func init() {
  19. qu.ReadConfig(&Sysconfig)
  20. //qu.ReadConfig("./tools.json", &Sysconfig)
  21. Mgo = &mgo.MongodbSim{
  22. MongodbAddr: qu.ObjToString(Sysconfig["addr"]),
  23. Size: qu.IntAll(Sysconfig["size"]),
  24. DbName: qu.ObjToString(Sysconfig["db"]),
  25. UserName: qu.ObjToString(Sysconfig["username"]),
  26. Password: qu.ObjToString(Sysconfig["password"]),
  27. }
  28. Mgo.InitPool()
  29. qu.Debug(Sysconfig)
  30. }
  31. func ShowTable() {
  32. fmt.Println("================================")
  33. fmt.Println("小工具-数据处理")
  34. fmt.Println("1、导入清洗数据")
  35. fmt.Println("2、推送数据")
  36. fmt.Println("3、联通数据判重")
  37. fmt.Println("4、业务数据判重")
  38. fmt.Println("0、EXIT")
  39. fmt.Println("================================")
  40. }
  41. func main() {
  42. for {
  43. ShowTable()
  44. var flag int
  45. fmt.Print("请输入你的操作:")
  46. fmt.Scan(&flag)
  47. if flag == 0 {
  48. fmt.Println("退出成功")
  49. os.Exit(0)
  50. } else if flag == 1 {
  51. fmt.Println("请输入文档地址.")
  52. var p string
  53. fmt.Scan(&p)
  54. if p != "" {
  55. task1(p)
  56. }
  57. } else if flag == 2 {
  58. fmt.Println("导入推送表数据.")
  59. task2()
  60. } else if flag == 3 {
  61. fmt.Println("请输入文档地址,进行数据判重.")
  62. var p string
  63. fmt.Scan(&p)
  64. if p != "" {
  65. task3()
  66. }
  67. } else if flag == 4 {
  68. fmt.Println("请输入表名,进行数据判重.")
  69. var coll, stime, etime, sType string
  70. fmt.Scan(&coll)
  71. if coll != "" {
  72. fmt.Println("请输入开始时间, 格式:2006-01-02")
  73. fmt.Scan(&stime)
  74. if stime != "" {
  75. fmt.Println("请输入结束时间, 格式:2006-01-02")
  76. fmt.Scan(&etime)
  77. if etime != "" {
  78. fmt.Println("请输入排序方式,1正序、-1倒序")
  79. fmt.Scan(&sType)
  80. if sType != "" {
  81. task4(coll, stime, etime, sType)
  82. }
  83. } else {
  84. fmt.Println("请输入结束时间, 格式:2006-01-02")
  85. }
  86. } else {
  87. fmt.Println("请输入开始时间, 格式:2006-01-02")
  88. }
  89. }
  90. }
  91. }
  92. }
  93. var FieldsMap = map[string]string{
  94. "是否优选": "is_push",
  95. "运营商中标标签": "tagname",
  96. "主体公司": "tagname2",
  97. "中标人": "s_winner",
  98. "招标人": "buyer",
  99. "中标金额": "bidamount",
  100. "是否为多标多包数据": "multipackage",
  101. }
  102. func task1(path string) {
  103. if path != "" {
  104. file, err := xlsx.OpenFile(path)
  105. if err != nil {
  106. panic(err)
  107. }
  108. sheet := file.Sheets[0]
  109. count := 0
  110. idcolnum := -1
  111. cellFieldName := map[int]string{}
  112. lastid := ""
  113. c1 := 0 // 多包第n条数据
  114. for rn, row := range sheet.Rows {
  115. update := make(map[string]interface{})
  116. if rn == 0 {
  117. for index, cell := range row.Cells {
  118. if cell.Value == "唯一标识" || cell.Value == "标讯编码(infoID)" { //id所在列
  119. idcolnum = index
  120. }
  121. if v := FieldsMap[cell.Value]; v != "" {
  122. cellFieldName[index] = v
  123. }
  124. }
  125. if idcolnum == -1 {
  126. break
  127. }
  128. continue
  129. } else {
  130. id := row.Cells[idcolnum].String()
  131. id = util.SE.DecodeString(id)
  132. for i, f := range cellFieldName {
  133. if val := row.Cells[i].Value; val != "" {
  134. if f == "is_push" {
  135. update[f] = qu.IntAll(val)
  136. } else if f == "multipackage" {
  137. update[fmt.Sprintf("v_baseinfo.%s", f)] = qu.IntAll(val)
  138. } else if f == "bidamount" {
  139. update[fmt.Sprintf("v_baseinfo.%s", f)] = qu.Float64All(val)
  140. } else {
  141. update[fmt.Sprintf("v_baseinfo.%s", f)] = val
  142. }
  143. }
  144. }
  145. if qu.IntAll(update["v_baseinfo.multipackage"]) == 1 {
  146. if c1 == 0 {
  147. count++
  148. }
  149. if c1 > 0 && lastid == id {
  150. info, _ := Mgo.FindById("f_sourceinfo_chinaunicom_zb_data", id, bson.M{"v_baseinfo.tagname": 1, "v_baseinfo.tagname2": 1, "v_baseinfo.s_winner": 1,
  151. "v_baseinfo.bidamount": 1, "v_baseinfo.package": 1})
  152. if len(*info) > 0 {
  153. baseinfo := (*info)["v_baseinfo"].(map[string]interface{})
  154. if baseinfo["package"] != nil {
  155. packageM := baseinfo["package"].(map[string]interface{})
  156. m := make(map[string]interface{})
  157. if update["v_baseinfo.bidamount"] != nil {
  158. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  159. }
  160. if update["v_baseinfo.s_winner"] != nil {
  161. m["s_winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  162. }
  163. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  164. update["v_baseinfo.package"] = packageM
  165. }
  166. if s := qu.ObjToString(baseinfo["tagname"]); s != "" {
  167. update["v_baseinfo.tagname"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname"])
  168. }
  169. if s := qu.ObjToString(baseinfo["tagname2"]); s != "" {
  170. update["v_baseinfo.tagname2"] = s + "," + qu.ObjToString(update["v_baseinfo.tagname2"])
  171. }
  172. if s := qu.ObjToString(baseinfo["s_winner"]); s != "" {
  173. update["v_baseinfo.s_winner"] = s + "," + qu.ObjToString(update["v_baseinfo.s_winner"])
  174. }
  175. update["v_baseinfo.bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"]) + qu.Float64All(baseinfo["bidamount"])
  176. c1++
  177. }
  178. } else {
  179. c1 = 0
  180. packageM := make(map[string]interface{})
  181. m := make(map[string]interface{})
  182. if update["v_baseinfo.bidamount"] != nil {
  183. m["bidamount"] = qu.Float64All(update["v_baseinfo.bidamount"])
  184. }
  185. if update["v_baseinfo.s_winner"] != nil {
  186. m["s_winner"] = qu.ObjToString(update["v_baseinfo.s_winner"])
  187. }
  188. packageM[fmt.Sprint(c1)] = map[string]interface{}{"winner_all": append([]interface{}{}, m)}
  189. update["v_baseinfo.package"] = packageM
  190. c1++
  191. }
  192. } else {
  193. count++
  194. c1 = 0
  195. }
  196. // 临时
  197. update["tag"] = "临时"
  198. lastid = id
  199. qu.Debug(update)
  200. Mgo.UpdateById("f_sourceinfo_chinaunicom_zb_data", id, bson.M{"$set": update})
  201. }
  202. }
  203. qu.Debug(fmt.Sprintf("更新数据成功,更新: %d条", count))
  204. os.Exit(0)
  205. }
  206. }
  207. func task2() {
  208. sess := Mgo.GetMgoConn()
  209. defer Mgo.DestoryMongoConn(sess)
  210. ch := make(chan bool, 5)
  211. wg := &sync.WaitGroup{}
  212. q := bson.M{"tag": "临时"}
  213. query := sess.DB(Mgo.DbName).C("f_sourceinfo_chinaunicom_zb_data").Find(q).Select(nil).Iter()
  214. count := 0
  215. for tmp := make(map[string]interface{}); query.Next(&tmp); count++ {
  216. ch <- true
  217. wg.Add(1)
  218. go func(tmp map[string]interface{}) {
  219. defer func() {
  220. <-ch
  221. wg.Done()
  222. }()
  223. info := tmp["v_baseinfo"].(map[string]interface{})
  224. info["createtime"] = time.Now().Unix()
  225. if qu.ObjToString(info["id"]) == "" {
  226. info["id"] = tmp["id"]
  227. }
  228. info["isOptimization"] = 1
  229. delete(info, "field_source")
  230. delete(info, "regions_log")
  231. Mgo.Save("tmp_usermail", info)
  232. }(tmp)
  233. tmp = make(map[string]interface{})
  234. }
  235. wg.Wait()
  236. qu.Debug(fmt.Sprintf("推送数据成功,推送成功: %d条", count))
  237. os.Exit(0)
  238. }
  239. func task3() {
  240. var path string
  241. flag.StringVar(&path, "f", "", "文件路径")
  242. flag.Parse()
  243. if path != "" {
  244. file, err := xlsx.OpenFile(path)
  245. if err != nil {
  246. panic(err)
  247. }
  248. sheet := file.Sheets[0]
  249. cellFieldName := map[int]string{}
  250. for rn, row := range sheet.Rows {
  251. if rn == 0 {
  252. for index, cell := range row.Cells {
  253. //if cell.Value == "招标人" || cell.Value == "中标人" || cell.Value == "中标金额" {
  254. // qu.Debug(cell.Value, index)
  255. //}
  256. if v := FieldsMap[cell.Value]; v != "" {
  257. cellFieldName[index] = v
  258. }
  259. }
  260. } else {
  261. q := bson.M{}
  262. for i, f := range cellFieldName {
  263. if val := row.Cells[i].Value; val != "" && (f == "s_winner" || f == "buyer") {
  264. q[f] = val
  265. }
  266. if val := row.Cells[i].Value; val != "" && f == "bidamount" {
  267. if qu.Float64All(val) != 0 {
  268. q[f] = qu.Float64All(val)
  269. }
  270. }
  271. }
  272. info, _ := Mgo.FindOne("zglt_history", q)
  273. if len(*info) > 0 {
  274. row.Cells[12].SetValue(-1)
  275. } else {
  276. row.Cells[12].SetValue(1)
  277. }
  278. }
  279. }
  280. err = file.Save(path)
  281. } else {
  282. flag.PrintDefaults()
  283. }
  284. }