package main import ( "fmt" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "jy/mongodbutil" "log" "qfw/common/src/github.com/tealeg/xlsx" "qfw/util" "strings" ) var ( SysConfig map[string]interface{} Extractmgo *mgo.Session //抽取 Previousmgo *mongodbutil.Pool //之前抽取 Newmgo *mongodbutil.Pool //最新抽取 ) /** 与上个抽取版本做比较 */ func init() { util.ReadConfig(&SysConfig) if len(SysConfig) < 1 { log.Println("配置文件读取失败") return } session, e := mgo.Dial(util.ObjToString(SysConfig["extractmgo"])) if e != nil { log.Fatal(e) } Extractmgo = session Previousmgo = mongodbutil.MgoFactory(2, 5, 120, util.ObjToString(SysConfig["previousmgo"]), util.ObjToString(SysConfig["previousdb"])) Newmgo = mongodbutil.MgoFactory(2, 5, 120, util.ObjToString(SysConfig["newmgo"]), util.ObjToString(SysConfig["newdb"])) } type versionComparison struct { Id interface{} `json:"_id"` Url string `json:"url"` } func main() { Query(1000) } func Query(num int) { xf, err := xlsx.OpenFile("抽取结果对比.xlsx") if err != nil { log.Println("读取文件", err) return } var projectcodenum, bidamountnum, winnernum, buyernum, budgetnum, projectnamenum int //不相等计数器 log.Println(num) if num < 1 { log.Println("查询数量应该大于0") return } sum := num //总量 //if strings.TrimSpace(gteid) == "" { // gteid = "386cd3000000000000000000" //} iter := Extractmgo.DB(util.ObjToString(SysConfig["extractdb"])).C(util.ObjToString(SysConfig["extractc"])).Find(nil).Select(bson.M{"_id": 1, "href": 1}).Iter() defer log.Println("关闭 iter:", iter.Close()) var data map[string]interface{} projectnames := make([]*Projectname, 0) buyers := make([]*Buyer, 0) projectcodes := make([]*Projectcode, 0) winners := make([]*Winner, 0) budgets := make([]*Budget, 0) bidamounts := make([]*Bidamount, 0) for iter.Next(&data) { if num == 0 { break } log.Println(data["_id"]) id := data["_id"].(bson.ObjectId).Hex() pdata, b := Previousmgo.FindById(util.ObjToString(SysConfig["previousc"]), id, SysConfig["keyfield"]) if !b || len(*pdata) == 0 { log.Println("oldId不存在") continue } log.Println("pdata:", pdata) ndata, b := Newmgo.FindById(util.ObjToString(SysConfig["newc"]), id, SysConfig["keyfield"]) if !b || len(*ndata) == 0 { log.Println("nweId不存在") continue } log.Println("ndata:", ndata) versioncomparison := new(versionComparison) versioncomparison.Id = id versioncomparison.Url = "https://www.jianyu360.com/article/content/" + util.CommonEncodeArticle("content", data["_id"].(bson.ObjectId).Hex()) + ".html" for k := range SysConfig["keyfield"].(map[string]interface{}) { if util.ObjToString((*pdata)[k]) != util.ObjToString((*ndata)[k]) { //log.Println(k) switch k { case "projectname": projectname := new(Projectname) projectname.versionComparison = *versioncomparison projectname.ProjectnameOld = util.ObjToString((*pdata)[k]) projectname.ProjectnameNew = util.ObjToString((*ndata)[k]) projectnames = append(projectnames, projectname) projectnamenum++ case "buyer": buyer := new(Buyer) buyer.versionComparison = *versioncomparison buyer.BuyerOld = util.ObjToString((*pdata)[k]) buyer.BuyerNew = util.ObjToString((*ndata)[k]) buyers = append(buyers, buyer) buyernum++ case "projectcode": projectcode := new(Projectcode) projectcode.ProjectcodeOld = util.ObjToString((*pdata)[k]) projectcode.ProjectcodeNew = util.ObjToString((*ndata)[k]) projectcode.versionComparison = *versioncomparison projectcodes = append(projectcodes, projectcode) projectcodenum++ case "winner": winner := new(Winner) winner.WinnerOld = util.ObjToString((*pdata)[k]) winner.WinnerNew = util.ObjToString((*ndata)[k]) winner.versionComparison = *versioncomparison winners = append(winners, winner) winnernum++ case "budget": budget := new(Budget) budget.BudgetOld = util.ObjToString((*pdata)[k]) budget.BudgetNew = util.ObjToString((*ndata)[k]) budget.versionComparison = *versioncomparison budgets = append(budgets, budget) budgetnum++ case "bidamount": bidamount := new(Bidamount) bidamount.BidamountOld = util.ObjToString((*pdata)[k]) bidamount.BidamountNew = util.ObjToString((*ndata)[k]) bidamount.versionComparison = *versioncomparison bidamounts = append(bidamounts, bidamount) bidamountnum++ } } } num-- fmt.Println() } log.Println(projectcodenum, bidamountnum, winnernum, buyernum, budgetnum, projectnamenum) for ins, ivs := range xf.Sheets { for inr, ivr := range ivs.Rows { for _, ivc := range ivr.Cells { //抽取对比 if ins == 0 { if inr < 3 { continue } switch strings.TrimSpace(ivc.String()) { case "projectname": //结果相同数量 ivr.Cells[1].SetValue(sum - projectnamenum) style := ivr.Cells[1].GetStyle() style.Font.Color = "000000" ivr.Cells[1].SetStyle(style) //结果不同数量 ivr.Cells[2].SetValue(projectnamenum) ivr.Cells[2].SetStyle(style) case "buyer": //结果相同数量 ivr.Cells[1].SetValue(sum - buyernum) style := ivr.Cells[1].GetStyle() style.Font.Color = "000000" ivr.Cells[1].SetStyle(style) //结果不同数量 ivr.Cells[2].SetValue(buyernum) ivr.Cells[2].SetStyle(style) case "projectcode": //结果相同数量 ivr.Cells[1].SetValue(sum - projectcodenum) style := ivr.Cells[1].GetStyle() style.Font.Color = "000000" ivr.Cells[1].SetStyle(style) //结果不同数量 ivr.Cells[2].SetValue(projectcodenum) ivr.Cells[2].SetStyle(style) case "winner": //结果相同数量 ivr.Cells[1].SetValue(sum - winnernum) style := ivr.Cells[1].GetStyle() style.Font.Color = "000000" ivr.Cells[1].SetStyle(style) //结果不同数量 ivr.Cells[2].SetValue(winnernum) ivr.Cells[2].SetStyle(style) case "budget": //结果相同数量 ivr.Cells[1].SetValue(sum - budgetnum) style := ivr.Cells[1].GetStyle() style.Font.Color = "000000" ivr.Cells[1].SetStyle(style) //结果不同数量 ivr.Cells[2].SetValue(budgetnum) ivr.Cells[2].SetStyle(style) case "bidamount": //结果相同数量 ivr.Cells[1].SetValue(sum - bidamountnum) style := ivr.Cells[1].GetStyle() style.Font.Color = "000000" ivr.Cells[1].SetStyle(style) //结果不同数量 ivr.Cells[2].SetValue(bidamountnum) ivr.Cells[2].SetStyle(style) } } } } if ins > 0 { if len(ivs.Rows) == 0 { row := ivs.AddRow() row.AddCell().SetValue("ObjectId") row.AddCell().SetValue("dev3.1.2") row.AddCell().SetValue("dev3.2") row.AddCell().SetValue("URL") } log.Println(ivs.Name) switch strings.TrimSpace(ivs.Name) { case "projectname": for _, v := range projectnames { row := ivs.AddRow() row.AddCell().SetValue(v.Id) row.AddCell().SetValue(v.ProjectnameOld) row.AddCell().SetValue(v.ProjectnameNew) row.AddCell().SetValue(v.Url) } case "buyer": for _, v := range buyers { row := ivs.AddRow() row.AddCell().SetValue(v.Id) row.AddCell().SetValue(v.BuyerOld) row.AddCell().SetValue(v.BuyerNew) row.AddCell().SetValue(v.Url) } case "projectcode": for _, v := range projectcodes { row := ivs.AddRow() row.AddCell().SetValue(v.Id) row.AddCell().SetValue(v.ProjectcodeOld) row.AddCell().SetValue(v.ProjectcodeNew) row.AddCell().SetValue(v.Url) } case "winner": for _, v := range winners { row := ivs.AddRow() row.AddCell().SetValue(v.Id) row.AddCell().SetValue(v.WinnerOld) row.AddCell().SetValue(v.WinnerNew) row.AddCell().SetValue(v.Url) } case "budget": for _, v := range budgets { row := ivs.AddRow() row.AddCell().SetValue(v.Id) row.AddCell().SetValue(v.BudgetOld) row.AddCell().SetValue(v.BudgetNew) row.AddCell().SetValue(v.Url) } case "bidamount": for _, v := range bidamounts { row := ivs.AddRow() row.AddCell().SetValue(v.Id) row.AddCell().SetValue(v.BidamountOld) row.AddCell().SetValue(v.BidamountNew) row.AddCell().SetValue(v.Url) } } } } err = xf.Save("resultdata.xlsx") if err != nil { log.Println("保存xlsx失败:", err) return } log.Println("xlsx保存成功") } type Projectname struct { versionComparison ProjectnameOld string ProjectnameNew string } type Buyer struct { versionComparison BuyerOld string BuyerNew string } type Projectcode struct { versionComparison ProjectcodeOld string ProjectcodeNew string } type Winner struct { versionComparison WinnerOld string WinnerNew string } type Budget struct { versionComparison BudgetOld string BudgetNew string } type Bidamount struct { versionComparison BidamountOld string BidamountNew string }