123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940 |
- package main
- import (
- "fmt"
- "io"
- "log"
- "os"
- "strings"
- "time"
- "strconv"
- util "app.yhyue.com/moapp/jybase/common"
- "app.yhyue.com/moapp/jybase/date"
- mg "app.yhyue.com/moapp/jybase/mongodb"
- "github.com/gogf/gf/v2/util/gconv"
- "github.com/tealeg/xlsx"
- "github.com/xuri/excelize/v2"
- )
- type config struct {
- Mongodb struct {
- Main *mgoConf
- }
- }
- type mgoConf struct {
- Address string
- Size int
- DbName string
- UserName string
- Password string
- Collection string
- Collection_back string
- }
- var (
- Sysconfig *config
- MQFW mg.MongodbSim
- )
- func init() {
- util.ReadConfig(&Sysconfig)
- MQFW = mg.MongodbSim{
- MongodbAddr: Sysconfig.Mongodb.Main.Address,
- Size: Sysconfig.Mongodb.Main.Size,
- DbName: Sysconfig.Mongodb.Main.DbName,
- UserName: Sysconfig.Mongodb.Main.UserName,
- Password: Sysconfig.Mongodb.Main.Password,
- }
- MQFW.InitPool()
- }
- //补齐数组
- func padSliceToLength(data []string, length int) []string {
- for len(data) < length {
- data = append(data, "")
- }
- return data
- }
- func toLower(str string) string {
- return strings.ToLower(str)
- }
- //生成行数
- func SetRow(s string, row []string, m map[string]string, typ string) []string {
- // areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
- row = padSliceToLength(row, 43)
- for k, v := range m {
- arr := strings.Split(k, "_")
- area := arr[2]
- year := arr[0]
- file_type := arr[1]
- if area == s {
- if typ == "item" {
- if year == "2024年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[4])
- c += gconv.Int(v)
- row[4] = gconv.String(c)
- case "pdf":
- row[5] = v
- case "doc", "docx":
- c := gconv.Int(row[6])
- c += gconv.Int(v)
- row[6] = gconv.String(c)
- }
- } else if year == "2023年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[17])
- c += gconv.Int(v)
- row[17] = gconv.String(c)
- case "pdf":
- row[18] = v
- case "doc", "docx":
- c := gconv.Int(row[6])
- c += gconv.Int(v)
- row[19] = gconv.String(c)
- }
- } else if year == "2025年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[30])
- c += gconv.Int(v)
- row[30] = gconv.String(c)
- case "pdf":
- row[31] = v
- case "doc", "docx":
- c := gconv.Int(row[32])
- c += gconv.Int(v)
- row[32] = gconv.String(c)
- }
- }
- } else if typ == "project" {
- if year == "2024年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[8])
- c += gconv.Int(v)
- row[8] = gconv.String(c)
- case "pdf":
- row[9] = v
- case "doc", "docx":
- c := gconv.Int(row[10])
- c += gconv.Int(v)
- row[10] = gconv.String(c)
- }
- } else if year == "2023年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[21])
- c += gconv.Int(v)
- row[21] = gconv.String(c)
- case "pdf":
- row[22] = v
- case "doc", "docx":
- c := gconv.Int(row[23])
- c += gconv.Int(v)
- row[23] = gconv.String(c)
- }
- } else if year == "2025年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[34])
- c += gconv.Int(v)
- row[34] = gconv.String(c)
- case "pdf":
- row[35] = v
- case "doc", "docx":
- c := gconv.Int(row[36])
- c += gconv.Int(v)
- row[36] = gconv.String(c)
- }
- }
- } else if typ == "purchasing" {
- if year == "2024年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[12])
- c += gconv.Int(v)
- row[12] = gconv.String(c)
- case "pdf":
- row[13] = v
- case "doc", "docx":
- c := gconv.Int(row[14])
- c += gconv.Int(v)
- row[14] = gconv.String(c)
- }
- } else if year == "2023年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[25])
- c += gconv.Int(v)
- row[25] = gconv.String(c)
- case "pdf":
- row[26] = v
- case "doc", "docx":
- c := gconv.Int(row[27])
- c += gconv.Int(v)
- row[27] = gconv.String(c)
- }
- } else if year == "2025年" {
- switch toLower(file_type) {
- case "xlsx", "xls":
- c := gconv.Int(row[38])
- c += gconv.Int(v)
- row[38] = gconv.String(c)
- case "pdf":
- row[39] = v
- case "doc", "docx":
- c := gconv.Int(row[40])
- c += gconv.Int(v)
- row[40] = gconv.String(c)
- }
- }
- }
- }
- }
- //文件
- if gconv.String(gconv.Int(row[4])+gconv.Int(row[5])+gconv.Int(row[6])) != "0" {
- log.Println("~1~~", row[7], gconv.String(gconv.Int(row[4])+gconv.Int(row[5])+gconv.Int(row[6])))
- log.Println("~2~~", gconv.Int(row[4]), gconv.Int(row[5]), gconv.Int(row[6]))
- row[7] = gconv.String(gconv.Int(row[4]) + gconv.Int(row[5]) + gconv.Int(row[6]))
- log.Println("~3~~", row[7])
- }
- if gconv.String(gconv.Int(row[17])+gconv.Int(row[18])+gconv.Int(row[19])) != "0" {
- row[20] = gconv.String(gconv.Int(row[17]) + gconv.Int(row[18]) + gconv.Int(row[19]))
- }
- if gconv.String(gconv.Int(row[30])+gconv.Int(row[31])+gconv.Int(row[32])) != "0" {
- row[33] = gconv.String(gconv.Int(row[30]) + gconv.Int(row[31]) + gconv.Int(row[32]))
- }
- //项目
- if gconv.String(gconv.Int(row[8])+gconv.Int(row[9])+gconv.Int(row[10])) != "0" {
- row[11] = gconv.String(gconv.Int(row[8]) + gconv.Int(row[9]) + gconv.Int(row[10]))
- }
- if gconv.String(gconv.Int(row[21])+gconv.Int(row[22])+gconv.Int(row[23])) != "0" {
- row[24] = gconv.String(gconv.Int(row[21]) + gconv.Int(row[22]) + gconv.Int(row[23]))
- }
- if gconv.String(gconv.Int(row[34])+gconv.Int(row[35])+gconv.Int(row[36])) != "0" {
- row[37] = gconv.String(gconv.Int(row[34]) + gconv.Int(row[35]) + gconv.Int(row[36]))
- }
- //明细
- if gconv.String(gconv.Int(row[12])+gconv.Int(row[13])+gconv.Int(row[14])) != "0" {
- row[15] = gconv.String(gconv.Int(row[12]) + gconv.Int(row[13]) + gconv.Int(row[14]))
- }
- if gconv.String(gconv.Int(row[25])+gconv.Int(row[26])+gconv.Int(row[27])) != "0" {
- row[28] = gconv.String(gconv.Int(row[25]) + gconv.Int(row[26]) + gconv.Int(row[27]))
- }
- if gconv.String(gconv.Int(row[38])+gconv.Int(row[39])+gconv.Int(row[40])) != "0" {
- row[41] = gconv.String(gconv.Int(row[38]) + gconv.Int(row[39]) + gconv.Int(row[40]))
- }
- //明细+绩效
- row[16] = gconv.String(gconv.Int(row[11]) + gconv.Int(row[15]))
- row[29] = gconv.String(gconv.Int(row[24]) + gconv.Int(row[28]))
- row[41] = gconv.String(gconv.Int(row[37]) + gconv.Int(row[41]))
- return row
- }
- func main() {
- // log.Println(getExcelName())
- copyExcel()
- // _, project_cityMap, _ := yusuan_project_find_area()
- project_areaMap, project_cityMap, project_districtMap := yusuan_project_find_area()
- fileitem_areaMap, fileitem_cityMap, fileitem_districtMap := yusuan_fileitem_find_area()
- purchasing_areaMap, purchasing_cityMap, purchasing_districtMap := yusuan_purchasing_find_area()
- // 打开现有的Excel文件
- f, err := excelize.OpenFile(getExcelName())
- if err != nil {
- fmt.Println(err)
- return
- }
- // 读取数据,假设我们读取第一张表单中A列的数据
- rows, err := f.GetRows("预算数据解析汇总表")
- if err != nil {
- fmt.Println(err)
- return
- }
- // 遍历行数据,进行更新
- for i, row := range rows {
- // 假设我们要更新A列中值为"老数据"的单元格
- // if row[0] == "老数据" {
- // // 更新数据,这里只是简单地将"老数据"替换为"新数据"
- // rows[i][0] = "新数据"
- // }
- if i < 5 {
- continue
- }
- // if i == 5 {
- // log.Println(row)
- row = padSliceToLength(row, 4)
- key := row[1] + row[2] + row[3]
- // row = append(row, gconv.String(project_areaMap[key]))
- row = SetRow(key, row, project_areaMap, "project")
- row = SetRow(key, row, project_cityMap, "project")
- row = SetRow(key, row, project_districtMap, "project")
- row = SetRow(key, row, fileitem_areaMap, "item")
- row = SetRow(key, row, fileitem_cityMap, "item")
- row = SetRow(key, row, fileitem_districtMap, "item")
- row = SetRow(key, row, purchasing_areaMap, "purchasing")
- row = SetRow(key, row, purchasing_cityMap, "purchasing")
- row = SetRow(key, row, purchasing_districtMap, "purchasing")
- err = f.SetSheetRow("预算数据解析汇总表", fmt.Sprintf("A%d", i+1), &row)
- if err != nil {
- log.Println("errrrr:", err)
- }
- // }
- // log.Println(i, "--", row)
- }
- if err := f.SaveAs(getExcelName()); err != nil {
- fmt.Println(err)
- }
- f.Close()
- setCount()
- ccc := 0
- for _, v := range project_areaMap {
- // arr := strings.Split(k, "_")
- // area := arr[2]
- // year := arr[0]
- // file_type := arr[1]
- c := gconv.Int(v)
- ccc += c
- }
- log.Println("area:", ccc)
- ccc2 := 0
- for _, v := range project_cityMap {
- // arr := strings.Split(k, "_")
- // area := arr[2]
- // year := arr[0]
- // file_type := arr[1]
- c := gconv.Int(v)
- ccc2 += c
- }
- log.Println("area:", ccc2)
- ccc3 := 0
- for _, v := range project_districtMap {
- // arr := strings.Split(k, "_")
- // area := arr[2]
- // year := arr[0]
- // file_type := arr[1]
- c := gconv.Int(v)
- ccc3 += c
- }
- log.Println("area:", ccc3)
- }
- func setCount() {
- // 打开 Excel 文件
- file, err := xlsx.OpenFile(getExcelName())
- if err != nil {
- fmt.Println("Error:", err)
- return
- }
- // 获取第一个工作表
- sheet := file.Sheets[0]
- // 遍历每一列,计算从第六行开始的数据总数(除了ABCD前四列)
- columnTotals := make([]float64, sheet.MaxCol)
- for i := 4; i < sheet.MaxCol; i++ {
- total := 0.0
- for j := 5; j < sheet.MaxRow; j++ {
- cell := sheet.Cell(j, i)
- value, err := strconv.ParseFloat(cell.String(), 64)
- if err == nil {
- total += value
- } else {
- //fmt.Printf("Error parsing value in row %d, column %d: %v\n", j+1, i+1, err)
- }
- }
- columnTotals[i] = total
- }
- // 将每列的总数写入到每列的第五行
- for i := 4; i < sheet.MaxCol; i++ {
- cell := sheet.Cell(4, i)
- cell.SetString(fmt.Sprintf("%.2f", columnTotals[i]))
- }
- // 保存修改后的 Excel 文件
- err = file.Save(getExcelName())
- if err != nil {
- fmt.Println("Error:", err)
- return
- }
- fmt.Println("Excel file saved successfully.")
- }
- func getExcelName() string {
- return fmt.Sprintf("./预算数据统计表%s.xlsx", time.Now().Format(date.Date_yyyyMMdd))
- }
- func copyExcel() {
- // 源文件路径
- srcFilePath := "./预算数据统计表_模板.xlsx"
- // 目标文件路径
- dstFilePath := getExcelName()
- // 打开源文件
- srcFile, err := os.Open(srcFilePath)
- if err != nil {
- fmt.Println("Error opening source file:", err)
- return
- }
- defer srcFile.Close()
- // 创建目标文件
- dstFile, err := os.Create(dstFilePath)
- if err != nil {
- fmt.Println("Error creating destination file:", err)
- return
- }
- defer dstFile.Close()
- // 复制文件内容
- _, err = io.Copy(dstFile, srcFile)
- if err != nil {
- fmt.Println("Error copying file:", err)
- return
- }
- }
- //
- func yusuan_project_find_area() (map[string]string, map[string]string, map[string]string) {
- //聚合查询语句
- areaMap := map[string]string{}
- cityMap := map[string]string{}
- districtMap := map[string]string{}
- log.Println("开始计算 项目 省份数据。。")
- pipeline := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$expr": map[string]interface{}{
- "$eq": []string{"$city", "$area"},
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "count": 1,
- "file_type": "$_id.file_type",
- },
- },
- }
- sess := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess)
- it := sess.DB("yusuan").C("yusuan_project").Pipe(pipeline).Iter()
- for tp := make(map[string]interface{}); it.Next(&tp); {
- log.Println("省份项目:", tp)
- area := gconv.String(tp["area"])
- area = municipality("", area)
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- file_type := gconv.String(tp["file_type"])
- areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 项目 省份数据。。")
- log.Println("开始计算 项目 城市数据。。")
- //市区
- pipeline_city := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$or": []map[string]interface{}{
- map[string]interface{}{"district": ""},
- map[string]interface{}{"district": nil},
- map[string]interface{}{"district": map[string]interface{}{"$exists": false}},
- },
- "$expr": map[string]interface{}{
- "$ne": []string{"$city", "$area"},
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "city": "$_id.city",
- "count": 1,
- "file_type": "$_id.file_type",
- },
- },
- }
- sess2 := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess2)
- it2 := sess2.DB("yusuan").C("yusuan_project").Pipe(pipeline_city).Iter()
- for tp := make(map[string]interface{}); it2.Next(&tp); {
- log.Println("城市项目:", tp)
- area := gconv.String(tp["area"])
- area = municipality(area, "")
- city := gconv.String(tp["city"])
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- file_type := gconv.String(tp["file_type"])
- cityMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 项目 城市数据。。")
- log.Println("开始计算 项目 区县数据。。")
- //区县
- pipeline_district := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$or": []map[string]interface{}{
- map[string]interface{}{
- "district": map[string]interface{}{
- "$exists": true,
- "$nin": []interface{}{nil, ""}},
- },
- },
- "$expr": map[string]interface{}{
- "$not": map[string]interface{}{
- "$regexMatch": map[string]interface{}{
- "input": "$district",
- "regex": "[0-9]",
- },
- },
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "district": "$district",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "count": 1,
- "city": "$_id.city",
- "district": "$_id.district",
- "file_type": "$_id.file_type",
- },
- },
- }
- sess3 := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess3)
- it3 := sess3.DB("yusuan").C("yusuan_project").Pipe(pipeline_district).Iter()
- for tp := make(map[string]interface{}); it3.Next(&tp); {
- log.Println("区县项目:", tp)
- area := gconv.String(tp["area"])
- city := gconv.String(tp["city"])
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- district := gconv.String(tp["district"])
- file_type := gconv.String(tp["file_type"])
- districtMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city+district)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 项目 区县数据。。")
- return areaMap, cityMap, districtMap
- }
- //
- func yusuan_fileitem_find_area() (map[string]string, map[string]string, map[string]string) {
- //聚合查询语句
- areaMap := map[string]string{}
- cityMap := map[string]string{}
- districtMap := map[string]string{}
- log.Println("开始计算 文件 省份数据。。")
- pipeline := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$expr": map[string]interface{}{
- "$eq": []string{"$city", "$area"},
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "count": 1,
- "file_type": "$_id.file_type",
- },
- },
- }
- sess := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess)
- it := sess.DB("yusuan").C("yusuan_fileitem").Pipe(pipeline).Iter()
- for tp := make(map[string]interface{}); it.Next(&tp); {
- log.Println("省份文件:", tp)
- area := gconv.String(tp["area"])
- area = municipality("", area)
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- file_type := gconv.String(tp["file_type"])
- areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 文件 省份数据。。")
- log.Println("开始计算 文件 城市数据。。")
- //市区
- pipeline_city := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$or": []map[string]interface{}{
- map[string]interface{}{"district": ""},
- map[string]interface{}{"district": nil},
- map[string]interface{}{"district": map[string]interface{}{"$exists": false}},
- },
- "$expr": map[string]interface{}{
- "$ne": []string{"$city", "$area"},
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "city": "$_id.city",
- "count": 1,
- "file_type": "$_id.file_type",
- },
- },
- }
- sess2 := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess2)
- it2 := sess2.DB("yusuan").C("yusuan_fileitem").Pipe(pipeline_city).Iter()
- for tp := make(map[string]interface{}); it2.Next(&tp); {
- log.Println("城市文件:", tp)
- area := gconv.String(tp["area"])
- area = municipality(area, "")
- city := gconv.String(tp["city"])
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- file_type := gconv.String(tp["file_type"])
- cityMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 文件 城市数据。。")
- log.Println("开始计算 文件 区县数据。。")
- //区县
- pipeline_district := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$or": []map[string]interface{}{
- map[string]interface{}{
- "district": map[string]interface{}{
- "$exists": true,
- "$nin": []interface{}{nil, ""}},
- },
- },
- "$expr": map[string]interface{}{
- "$not": map[string]interface{}{
- "$regexMatch": map[string]interface{}{
- "input": "$district",
- "regex": "[0-9]",
- },
- },
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "district": "$district",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "count": 1,
- "city": "$_id.city",
- "district": "$_id.district",
- "file_type": "$_id.file_type",
- },
- },
- }
- sess3 := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess3)
- it3 := sess3.DB("yusuan").C("yusuan_fileitem").Pipe(pipeline_district).Iter()
- for tp := make(map[string]interface{}); it3.Next(&tp); {
- log.Println("区县文件:", tp)
- area := gconv.String(tp["area"])
- city := gconv.String(tp["city"])
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- district := gconv.String(tp["district"])
- file_type := gconv.String(tp["file_type"])
- districtMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city+district)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 文件 区县数据。。")
- return areaMap, cityMap, districtMap
- }
- //
- func yusuan_purchasing_find_area() (map[string]string, map[string]string, map[string]string) {
- //聚合查询语句
- areaMap := map[string]string{}
- cityMap := map[string]string{}
- districtMap := map[string]string{}
- log.Println("开始计算 明细 省份数据。。")
- pipeline := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$expr": map[string]interface{}{
- "$eq": []string{"$city", "$area"},
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "count": 1,
- "file_type": "$_id.file_type",
- },
- },
- }
- sess := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess)
- it := sess.DB("yusuan").C("yusuan_purchasing").Pipe(pipeline).Iter()
- for tp := make(map[string]interface{}); it.Next(&tp); {
- log.Println("省份明细:", tp)
- area := gconv.String(tp["area"])
- area = municipality("", area)
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- file_type := gconv.String(tp["file_type"])
- areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 明细 省份数据。。")
- log.Println("开始计算 明细 城市数据。。")
- //市区
- pipeline_city := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$or": []map[string]interface{}{
- map[string]interface{}{"district": ""},
- map[string]interface{}{"district": nil},
- map[string]interface{}{"district": map[string]interface{}{"$exists": false}},
- },
- "$expr": map[string]interface{}{
- "$ne": []string{"$city", "$area"},
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "city": "$_id.city",
- "count": 1,
- "file_type": "$_id.file_type",
- },
- },
- }
- sess2 := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess2)
- it2 := sess2.DB("yusuan").C("yusuan_purchasing").Pipe(pipeline_city).Iter()
- for tp := make(map[string]interface{}); it2.Next(&tp); {
- log.Println("城市明细:", tp)
- area := gconv.String(tp["area"])
- area = municipality(area, "")
- city := gconv.String(tp["city"])
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- file_type := gconv.String(tp["file_type"])
- cityMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 明细 城市数据。。")
- log.Println("开始计算 明细 区县数据。。")
- //区县
- pipeline_district := []map[string]interface{}{
- map[string]interface{}{
- "$match": map[string]interface{}{
- "$or": []map[string]interface{}{
- map[string]interface{}{
- "district": map[string]interface{}{
- "$exists": true,
- "$nin": []interface{}{nil, ""}},
- },
- },
- "$expr": map[string]interface{}{
- "$not": map[string]interface{}{
- "$regexMatch": map[string]interface{}{
- "input": "$district",
- "regex": "[0-9]",
- },
- },
- },
- },
- },
- map[string]interface{}{
- "$group": map[string]interface{}{
- "_id": map[string]interface{}{
- "year": "$year",
- "area": "$area",
- "city": "$city",
- "district": "$district",
- "file_type": "$file_type",
- },
- "count": map[string]interface{}{"$sum": 1},
- },
- },
- map[string]interface{}{
- "$project": map[string]interface{}{
- "year": "$_id.year",
- "area": "$_id.area",
- "count": 1,
- "city": "$_id.city",
- "district": "$_id.district",
- "file_type": "$_id.file_type",
- },
- },
- }
- sess3 := MQFW.GetMgoConn()
- defer MQFW.DestoryMongoConn(sess3)
- it3 := sess3.DB("yusuan").C("yusuan_purchasing").Pipe(pipeline_district).Iter()
- for tp := make(map[string]interface{}); it3.Next(&tp); {
- log.Println("区县明细:", tp)
- area := gconv.String(tp["area"])
- city := gconv.String(tp["city"])
- count := gconv.Int(tp["count"])
- year := gconv.String(tp["year"])
- district := gconv.String(tp["district"])
- file_type := gconv.String(tp["file_type"])
- districtMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city+district)] = gconv.String(count)
- tp = make(map[string]interface{})
- }
- log.Println("结束计算 明细 区县数据。。")
- return areaMap, cityMap, districtMap
- }
- //直辖市转换
- func municipality(city, area string) string {
- m := map[string]bool{
- "上海": true,
- "北京": true,
- "天津": true,
- "重庆": true,
- "中央": true,
- }
- if m[city] {
- return city + city + "市"
- }
- if m[area] {
- return area + area
- }
- if city != "" {
- return city
- }
- if area != "" {
- return area
- }
- return ""
- }
|