main.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "log"
  6. "os"
  7. "strings"
  8. "time"
  9. "strconv"
  10. util "app.yhyue.com/moapp/jybase/common"
  11. "app.yhyue.com/moapp/jybase/date"
  12. mg "app.yhyue.com/moapp/jybase/mongodb"
  13. "github.com/gogf/gf/v2/util/gconv"
  14. "github.com/tealeg/xlsx"
  15. "github.com/xuri/excelize/v2"
  16. )
  17. type config struct {
  18. Mongodb struct {
  19. Main *mgoConf
  20. }
  21. }
  22. type mgoConf struct {
  23. Address string
  24. Size int
  25. DbName string
  26. UserName string
  27. Password string
  28. Collection string
  29. Collection_back string
  30. }
  31. var (
  32. Sysconfig *config
  33. MQFW mg.MongodbSim
  34. )
  35. func init() {
  36. util.ReadConfig(&Sysconfig)
  37. MQFW = mg.MongodbSim{
  38. MongodbAddr: Sysconfig.Mongodb.Main.Address,
  39. Size: Sysconfig.Mongodb.Main.Size,
  40. DbName: Sysconfig.Mongodb.Main.DbName,
  41. UserName: Sysconfig.Mongodb.Main.UserName,
  42. Password: Sysconfig.Mongodb.Main.Password,
  43. }
  44. MQFW.InitPool()
  45. }
  46. //补齐数组
  47. func padSliceToLength(data []string, length int) []string {
  48. for len(data) < length {
  49. data = append(data, "")
  50. }
  51. return data
  52. }
  53. func toLower(str string) string {
  54. return strings.ToLower(str)
  55. }
  56. //生成行数
  57. func SetRow(s string, row []string, m map[string]string, typ string) []string {
  58. // areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
  59. row = padSliceToLength(row, 43)
  60. for k, v := range m {
  61. arr := strings.Split(k, "_")
  62. area := arr[2]
  63. year := arr[0]
  64. file_type := arr[1]
  65. if area == s {
  66. if typ == "item" {
  67. if year == "2024年" {
  68. switch toLower(file_type) {
  69. case "xlsx", "xls":
  70. c := gconv.Int(row[4])
  71. c += gconv.Int(v)
  72. row[4] = gconv.String(c)
  73. case "pdf":
  74. row[5] = v
  75. case "doc", "docx":
  76. c := gconv.Int(row[6])
  77. c += gconv.Int(v)
  78. row[6] = gconv.String(c)
  79. }
  80. } else if year == "2023年" {
  81. switch toLower(file_type) {
  82. case "xlsx", "xls":
  83. c := gconv.Int(row[17])
  84. c += gconv.Int(v)
  85. row[17] = gconv.String(c)
  86. case "pdf":
  87. row[18] = v
  88. case "doc", "docx":
  89. c := gconv.Int(row[6])
  90. c += gconv.Int(v)
  91. row[19] = gconv.String(c)
  92. }
  93. } else if year == "2025年" {
  94. switch toLower(file_type) {
  95. case "xlsx", "xls":
  96. c := gconv.Int(row[30])
  97. c += gconv.Int(v)
  98. row[30] = gconv.String(c)
  99. case "pdf":
  100. row[31] = v
  101. case "doc", "docx":
  102. c := gconv.Int(row[32])
  103. c += gconv.Int(v)
  104. row[32] = gconv.String(c)
  105. }
  106. }
  107. } else if typ == "project" {
  108. if year == "2024年" {
  109. switch toLower(file_type) {
  110. case "xlsx", "xls":
  111. c := gconv.Int(row[8])
  112. c += gconv.Int(v)
  113. row[8] = gconv.String(c)
  114. case "pdf":
  115. row[9] = v
  116. case "doc", "docx":
  117. c := gconv.Int(row[10])
  118. c += gconv.Int(v)
  119. row[10] = gconv.String(c)
  120. }
  121. } else if year == "2023年" {
  122. switch toLower(file_type) {
  123. case "xlsx", "xls":
  124. c := gconv.Int(row[21])
  125. c += gconv.Int(v)
  126. row[21] = gconv.String(c)
  127. case "pdf":
  128. row[22] = v
  129. case "doc", "docx":
  130. c := gconv.Int(row[23])
  131. c += gconv.Int(v)
  132. row[23] = gconv.String(c)
  133. }
  134. } else if year == "2025年" {
  135. switch toLower(file_type) {
  136. case "xlsx", "xls":
  137. c := gconv.Int(row[34])
  138. c += gconv.Int(v)
  139. row[34] = gconv.String(c)
  140. case "pdf":
  141. row[35] = v
  142. case "doc", "docx":
  143. c := gconv.Int(row[36])
  144. c += gconv.Int(v)
  145. row[36] = gconv.String(c)
  146. }
  147. }
  148. } else if typ == "purchasing" {
  149. if year == "2024年" {
  150. switch toLower(file_type) {
  151. case "xlsx", "xls":
  152. c := gconv.Int(row[12])
  153. c += gconv.Int(v)
  154. row[12] = gconv.String(c)
  155. case "pdf":
  156. row[13] = v
  157. case "doc", "docx":
  158. c := gconv.Int(row[14])
  159. c += gconv.Int(v)
  160. row[14] = gconv.String(c)
  161. }
  162. } else if year == "2023年" {
  163. switch toLower(file_type) {
  164. case "xlsx", "xls":
  165. c := gconv.Int(row[25])
  166. c += gconv.Int(v)
  167. row[25] = gconv.String(c)
  168. case "pdf":
  169. row[26] = v
  170. case "doc", "docx":
  171. c := gconv.Int(row[27])
  172. c += gconv.Int(v)
  173. row[27] = gconv.String(c)
  174. }
  175. } else if year == "2025年" {
  176. switch toLower(file_type) {
  177. case "xlsx", "xls":
  178. c := gconv.Int(row[38])
  179. c += gconv.Int(v)
  180. row[38] = gconv.String(c)
  181. case "pdf":
  182. row[39] = v
  183. case "doc", "docx":
  184. c := gconv.Int(row[40])
  185. c += gconv.Int(v)
  186. row[40] = gconv.String(c)
  187. }
  188. }
  189. }
  190. }
  191. }
  192. //文件
  193. if gconv.String(gconv.Int(row[4])+gconv.Int(row[5])+gconv.Int(row[6])) != "0" {
  194. log.Println("~1~~", row[7], gconv.String(gconv.Int(row[4])+gconv.Int(row[5])+gconv.Int(row[6])))
  195. log.Println("~2~~", gconv.Int(row[4]), gconv.Int(row[5]), gconv.Int(row[6]))
  196. row[7] = gconv.String(gconv.Int(row[4]) + gconv.Int(row[5]) + gconv.Int(row[6]))
  197. log.Println("~3~~", row[7])
  198. }
  199. if gconv.String(gconv.Int(row[17])+gconv.Int(row[18])+gconv.Int(row[19])) != "0" {
  200. row[20] = gconv.String(gconv.Int(row[17]) + gconv.Int(row[18]) + gconv.Int(row[19]))
  201. }
  202. if gconv.String(gconv.Int(row[30])+gconv.Int(row[31])+gconv.Int(row[32])) != "0" {
  203. row[33] = gconv.String(gconv.Int(row[30]) + gconv.Int(row[31]) + gconv.Int(row[32]))
  204. }
  205. //项目
  206. if gconv.String(gconv.Int(row[8])+gconv.Int(row[9])+gconv.Int(row[10])) != "0" {
  207. row[11] = gconv.String(gconv.Int(row[8]) + gconv.Int(row[9]) + gconv.Int(row[10]))
  208. }
  209. if gconv.String(gconv.Int(row[21])+gconv.Int(row[22])+gconv.Int(row[23])) != "0" {
  210. row[24] = gconv.String(gconv.Int(row[21]) + gconv.Int(row[22]) + gconv.Int(row[23]))
  211. }
  212. if gconv.String(gconv.Int(row[34])+gconv.Int(row[35])+gconv.Int(row[36])) != "0" {
  213. row[37] = gconv.String(gconv.Int(row[34]) + gconv.Int(row[35]) + gconv.Int(row[36]))
  214. }
  215. //明细
  216. if gconv.String(gconv.Int(row[12])+gconv.Int(row[13])+gconv.Int(row[14])) != "0" {
  217. row[15] = gconv.String(gconv.Int(row[12]) + gconv.Int(row[13]) + gconv.Int(row[14]))
  218. }
  219. if gconv.String(gconv.Int(row[25])+gconv.Int(row[26])+gconv.Int(row[27])) != "0" {
  220. row[28] = gconv.String(gconv.Int(row[25]) + gconv.Int(row[26]) + gconv.Int(row[27]))
  221. }
  222. if gconv.String(gconv.Int(row[38])+gconv.Int(row[39])+gconv.Int(row[40])) != "0" {
  223. row[41] = gconv.String(gconv.Int(row[38]) + gconv.Int(row[39]) + gconv.Int(row[40]))
  224. }
  225. //明细+绩效
  226. row[16] = gconv.String(gconv.Int(row[11]) + gconv.Int(row[15]))
  227. row[29] = gconv.String(gconv.Int(row[24]) + gconv.Int(row[28]))
  228. row[41] = gconv.String(gconv.Int(row[37]) + gconv.Int(row[41]))
  229. return row
  230. }
  231. func main() {
  232. // log.Println(getExcelName())
  233. copyExcel()
  234. // _, project_cityMap, _ := yusuan_project_find_area()
  235. project_areaMap, project_cityMap, project_districtMap := yusuan_project_find_area()
  236. fileitem_areaMap, fileitem_cityMap, fileitem_districtMap := yusuan_fileitem_find_area()
  237. purchasing_areaMap, purchasing_cityMap, purchasing_districtMap := yusuan_purchasing_find_area()
  238. // 打开现有的Excel文件
  239. f, err := excelize.OpenFile(getExcelName())
  240. if err != nil {
  241. fmt.Println(err)
  242. return
  243. }
  244. // 读取数据,假设我们读取第一张表单中A列的数据
  245. rows, err := f.GetRows("预算数据解析汇总表")
  246. if err != nil {
  247. fmt.Println(err)
  248. return
  249. }
  250. // 遍历行数据,进行更新
  251. for i, row := range rows {
  252. // 假设我们要更新A列中值为"老数据"的单元格
  253. // if row[0] == "老数据" {
  254. // // 更新数据,这里只是简单地将"老数据"替换为"新数据"
  255. // rows[i][0] = "新数据"
  256. // }
  257. if i < 5 {
  258. continue
  259. }
  260. // if i == 5 {
  261. // log.Println(row)
  262. row = padSliceToLength(row, 4)
  263. key := row[1] + row[2] + row[3]
  264. // row = append(row, gconv.String(project_areaMap[key]))
  265. row = SetRow(key, row, project_areaMap, "project")
  266. row = SetRow(key, row, project_cityMap, "project")
  267. row = SetRow(key, row, project_districtMap, "project")
  268. row = SetRow(key, row, fileitem_areaMap, "item")
  269. row = SetRow(key, row, fileitem_cityMap, "item")
  270. row = SetRow(key, row, fileitem_districtMap, "item")
  271. row = SetRow(key, row, purchasing_areaMap, "purchasing")
  272. row = SetRow(key, row, purchasing_cityMap, "purchasing")
  273. row = SetRow(key, row, purchasing_districtMap, "purchasing")
  274. err = f.SetSheetRow("预算数据解析汇总表", fmt.Sprintf("A%d", i+1), &row)
  275. if err != nil {
  276. log.Println("errrrr:", err)
  277. }
  278. // }
  279. // log.Println(i, "--", row)
  280. }
  281. if err := f.SaveAs(getExcelName()); err != nil {
  282. fmt.Println(err)
  283. }
  284. f.Close()
  285. setCount()
  286. ccc := 0
  287. for _, v := range project_areaMap {
  288. // arr := strings.Split(k, "_")
  289. // area := arr[2]
  290. // year := arr[0]
  291. // file_type := arr[1]
  292. c := gconv.Int(v)
  293. ccc += c
  294. }
  295. log.Println("area:", ccc)
  296. ccc2 := 0
  297. for _, v := range project_cityMap {
  298. // arr := strings.Split(k, "_")
  299. // area := arr[2]
  300. // year := arr[0]
  301. // file_type := arr[1]
  302. c := gconv.Int(v)
  303. ccc2 += c
  304. }
  305. log.Println("area:", ccc2)
  306. ccc3 := 0
  307. for _, v := range project_districtMap {
  308. // arr := strings.Split(k, "_")
  309. // area := arr[2]
  310. // year := arr[0]
  311. // file_type := arr[1]
  312. c := gconv.Int(v)
  313. ccc3 += c
  314. }
  315. log.Println("area:", ccc3)
  316. }
  317. func setCount() {
  318. // 打开 Excel 文件
  319. file, err := xlsx.OpenFile(getExcelName())
  320. if err != nil {
  321. fmt.Println("Error:", err)
  322. return
  323. }
  324. // 获取第一个工作表
  325. sheet := file.Sheets[0]
  326. // 遍历每一列,计算从第六行开始的数据总数(除了ABCD前四列)
  327. columnTotals := make([]float64, sheet.MaxCol)
  328. for i := 4; i < sheet.MaxCol; i++ {
  329. total := 0.0
  330. for j := 5; j < sheet.MaxRow; j++ {
  331. cell := sheet.Cell(j, i)
  332. value, err := strconv.ParseFloat(cell.String(), 64)
  333. if err == nil {
  334. total += value
  335. } else {
  336. //fmt.Printf("Error parsing value in row %d, column %d: %v\n", j+1, i+1, err)
  337. }
  338. }
  339. columnTotals[i] = total
  340. }
  341. // 将每列的总数写入到每列的第五行
  342. for i := 4; i < sheet.MaxCol; i++ {
  343. cell := sheet.Cell(4, i)
  344. cell.SetString(fmt.Sprintf("%.2f", columnTotals[i]))
  345. }
  346. // 保存修改后的 Excel 文件
  347. err = file.Save(getExcelName())
  348. if err != nil {
  349. fmt.Println("Error:", err)
  350. return
  351. }
  352. fmt.Println("Excel file saved successfully.")
  353. }
  354. func getExcelName() string {
  355. return fmt.Sprintf("./预算数据统计表%s.xlsx", time.Now().Format(date.Date_yyyyMMdd))
  356. }
  357. func copyExcel() {
  358. // 源文件路径
  359. srcFilePath := "./预算数据统计表_模板.xlsx"
  360. // 目标文件路径
  361. dstFilePath := getExcelName()
  362. // 打开源文件
  363. srcFile, err := os.Open(srcFilePath)
  364. if err != nil {
  365. fmt.Println("Error opening source file:", err)
  366. return
  367. }
  368. defer srcFile.Close()
  369. // 创建目标文件
  370. dstFile, err := os.Create(dstFilePath)
  371. if err != nil {
  372. fmt.Println("Error creating destination file:", err)
  373. return
  374. }
  375. defer dstFile.Close()
  376. // 复制文件内容
  377. _, err = io.Copy(dstFile, srcFile)
  378. if err != nil {
  379. fmt.Println("Error copying file:", err)
  380. return
  381. }
  382. }
  383. //
  384. func yusuan_project_find_area() (map[string]string, map[string]string, map[string]string) {
  385. //聚合查询语句
  386. areaMap := map[string]string{}
  387. cityMap := map[string]string{}
  388. districtMap := map[string]string{}
  389. log.Println("开始计算 项目 省份数据。。")
  390. pipeline := []map[string]interface{}{
  391. map[string]interface{}{
  392. "$match": map[string]interface{}{
  393. "$expr": map[string]interface{}{
  394. "$eq": []string{"$city", "$area"},
  395. },
  396. },
  397. },
  398. map[string]interface{}{
  399. "$group": map[string]interface{}{
  400. "_id": map[string]interface{}{
  401. "year": "$year",
  402. "area": "$area",
  403. "city": "$city",
  404. "file_type": "$file_type",
  405. },
  406. "count": map[string]interface{}{"$sum": 1},
  407. },
  408. },
  409. map[string]interface{}{
  410. "$project": map[string]interface{}{
  411. "year": "$_id.year",
  412. "area": "$_id.area",
  413. "count": 1,
  414. "file_type": "$_id.file_type",
  415. },
  416. },
  417. }
  418. sess := MQFW.GetMgoConn()
  419. defer MQFW.DestoryMongoConn(sess)
  420. it := sess.DB("yusuan").C("yusuan_project").Pipe(pipeline).Iter()
  421. for tp := make(map[string]interface{}); it.Next(&tp); {
  422. log.Println("省份项目:", tp)
  423. area := gconv.String(tp["area"])
  424. area = municipality("", area)
  425. count := gconv.Int(tp["count"])
  426. year := gconv.String(tp["year"])
  427. file_type := gconv.String(tp["file_type"])
  428. areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
  429. tp = make(map[string]interface{})
  430. }
  431. log.Println("结束计算 项目 省份数据。。")
  432. log.Println("开始计算 项目 城市数据。。")
  433. //市区
  434. pipeline_city := []map[string]interface{}{
  435. map[string]interface{}{
  436. "$match": map[string]interface{}{
  437. "$or": []map[string]interface{}{
  438. map[string]interface{}{"district": ""},
  439. map[string]interface{}{"district": nil},
  440. map[string]interface{}{"district": map[string]interface{}{"$exists": false}},
  441. },
  442. "$expr": map[string]interface{}{
  443. "$ne": []string{"$city", "$area"},
  444. },
  445. },
  446. },
  447. map[string]interface{}{
  448. "$group": map[string]interface{}{
  449. "_id": map[string]interface{}{
  450. "year": "$year",
  451. "area": "$area",
  452. "city": "$city",
  453. "file_type": "$file_type",
  454. },
  455. "count": map[string]interface{}{"$sum": 1},
  456. },
  457. },
  458. map[string]interface{}{
  459. "$project": map[string]interface{}{
  460. "year": "$_id.year",
  461. "area": "$_id.area",
  462. "city": "$_id.city",
  463. "count": 1,
  464. "file_type": "$_id.file_type",
  465. },
  466. },
  467. }
  468. sess2 := MQFW.GetMgoConn()
  469. defer MQFW.DestoryMongoConn(sess2)
  470. it2 := sess2.DB("yusuan").C("yusuan_project").Pipe(pipeline_city).Iter()
  471. for tp := make(map[string]interface{}); it2.Next(&tp); {
  472. log.Println("城市项目:", tp)
  473. area := gconv.String(tp["area"])
  474. area = municipality(area, "")
  475. city := gconv.String(tp["city"])
  476. count := gconv.Int(tp["count"])
  477. year := gconv.String(tp["year"])
  478. file_type := gconv.String(tp["file_type"])
  479. cityMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city)] = gconv.String(count)
  480. tp = make(map[string]interface{})
  481. }
  482. log.Println("结束计算 项目 城市数据。。")
  483. log.Println("开始计算 项目 区县数据。。")
  484. //区县
  485. pipeline_district := []map[string]interface{}{
  486. map[string]interface{}{
  487. "$match": map[string]interface{}{
  488. "$or": []map[string]interface{}{
  489. map[string]interface{}{
  490. "district": map[string]interface{}{
  491. "$exists": true,
  492. "$nin": []interface{}{nil, ""}},
  493. },
  494. },
  495. "$expr": map[string]interface{}{
  496. "$not": map[string]interface{}{
  497. "$regexMatch": map[string]interface{}{
  498. "input": "$district",
  499. "regex": "[0-9]",
  500. },
  501. },
  502. },
  503. },
  504. },
  505. map[string]interface{}{
  506. "$group": map[string]interface{}{
  507. "_id": map[string]interface{}{
  508. "year": "$year",
  509. "area": "$area",
  510. "city": "$city",
  511. "district": "$district",
  512. "file_type": "$file_type",
  513. },
  514. "count": map[string]interface{}{"$sum": 1},
  515. },
  516. },
  517. map[string]interface{}{
  518. "$project": map[string]interface{}{
  519. "year": "$_id.year",
  520. "area": "$_id.area",
  521. "count": 1,
  522. "city": "$_id.city",
  523. "district": "$_id.district",
  524. "file_type": "$_id.file_type",
  525. },
  526. },
  527. }
  528. sess3 := MQFW.GetMgoConn()
  529. defer MQFW.DestoryMongoConn(sess3)
  530. it3 := sess3.DB("yusuan").C("yusuan_project").Pipe(pipeline_district).Iter()
  531. for tp := make(map[string]interface{}); it3.Next(&tp); {
  532. log.Println("区县项目:", tp)
  533. area := gconv.String(tp["area"])
  534. city := gconv.String(tp["city"])
  535. count := gconv.Int(tp["count"])
  536. year := gconv.String(tp["year"])
  537. district := gconv.String(tp["district"])
  538. file_type := gconv.String(tp["file_type"])
  539. districtMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city+district)] = gconv.String(count)
  540. tp = make(map[string]interface{})
  541. }
  542. log.Println("结束计算 项目 区县数据。。")
  543. return areaMap, cityMap, districtMap
  544. }
  545. //
  546. func yusuan_fileitem_find_area() (map[string]string, map[string]string, map[string]string) {
  547. //聚合查询语句
  548. areaMap := map[string]string{}
  549. cityMap := map[string]string{}
  550. districtMap := map[string]string{}
  551. log.Println("开始计算 文件 省份数据。。")
  552. pipeline := []map[string]interface{}{
  553. map[string]interface{}{
  554. "$match": map[string]interface{}{
  555. "$expr": map[string]interface{}{
  556. "$eq": []string{"$city", "$area"},
  557. },
  558. },
  559. },
  560. map[string]interface{}{
  561. "$group": map[string]interface{}{
  562. "_id": map[string]interface{}{
  563. "year": "$year",
  564. "area": "$area",
  565. "city": "$city",
  566. "file_type": "$file_type",
  567. },
  568. "count": map[string]interface{}{"$sum": 1},
  569. },
  570. },
  571. map[string]interface{}{
  572. "$project": map[string]interface{}{
  573. "year": "$_id.year",
  574. "area": "$_id.area",
  575. "count": 1,
  576. "file_type": "$_id.file_type",
  577. },
  578. },
  579. }
  580. sess := MQFW.GetMgoConn()
  581. defer MQFW.DestoryMongoConn(sess)
  582. it := sess.DB("yusuan").C("yusuan_fileitem").Pipe(pipeline).Iter()
  583. for tp := make(map[string]interface{}); it.Next(&tp); {
  584. log.Println("省份文件:", tp)
  585. area := gconv.String(tp["area"])
  586. area = municipality("", area)
  587. count := gconv.Int(tp["count"])
  588. year := gconv.String(tp["year"])
  589. file_type := gconv.String(tp["file_type"])
  590. areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
  591. tp = make(map[string]interface{})
  592. }
  593. log.Println("结束计算 文件 省份数据。。")
  594. log.Println("开始计算 文件 城市数据。。")
  595. //市区
  596. pipeline_city := []map[string]interface{}{
  597. map[string]interface{}{
  598. "$match": map[string]interface{}{
  599. "$or": []map[string]interface{}{
  600. map[string]interface{}{"district": ""},
  601. map[string]interface{}{"district": nil},
  602. map[string]interface{}{"district": map[string]interface{}{"$exists": false}},
  603. },
  604. "$expr": map[string]interface{}{
  605. "$ne": []string{"$city", "$area"},
  606. },
  607. },
  608. },
  609. map[string]interface{}{
  610. "$group": map[string]interface{}{
  611. "_id": map[string]interface{}{
  612. "year": "$year",
  613. "area": "$area",
  614. "city": "$city",
  615. "file_type": "$file_type",
  616. },
  617. "count": map[string]interface{}{"$sum": 1},
  618. },
  619. },
  620. map[string]interface{}{
  621. "$project": map[string]interface{}{
  622. "year": "$_id.year",
  623. "area": "$_id.area",
  624. "city": "$_id.city",
  625. "count": 1,
  626. "file_type": "$_id.file_type",
  627. },
  628. },
  629. }
  630. sess2 := MQFW.GetMgoConn()
  631. defer MQFW.DestoryMongoConn(sess2)
  632. it2 := sess2.DB("yusuan").C("yusuan_fileitem").Pipe(pipeline_city).Iter()
  633. for tp := make(map[string]interface{}); it2.Next(&tp); {
  634. log.Println("城市文件:", tp)
  635. area := gconv.String(tp["area"])
  636. area = municipality(area, "")
  637. city := gconv.String(tp["city"])
  638. count := gconv.Int(tp["count"])
  639. year := gconv.String(tp["year"])
  640. file_type := gconv.String(tp["file_type"])
  641. cityMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city)] = gconv.String(count)
  642. tp = make(map[string]interface{})
  643. }
  644. log.Println("结束计算 文件 城市数据。。")
  645. log.Println("开始计算 文件 区县数据。。")
  646. //区县
  647. pipeline_district := []map[string]interface{}{
  648. map[string]interface{}{
  649. "$match": map[string]interface{}{
  650. "$or": []map[string]interface{}{
  651. map[string]interface{}{
  652. "district": map[string]interface{}{
  653. "$exists": true,
  654. "$nin": []interface{}{nil, ""}},
  655. },
  656. },
  657. "$expr": map[string]interface{}{
  658. "$not": map[string]interface{}{
  659. "$regexMatch": map[string]interface{}{
  660. "input": "$district",
  661. "regex": "[0-9]",
  662. },
  663. },
  664. },
  665. },
  666. },
  667. map[string]interface{}{
  668. "$group": map[string]interface{}{
  669. "_id": map[string]interface{}{
  670. "year": "$year",
  671. "area": "$area",
  672. "city": "$city",
  673. "district": "$district",
  674. "file_type": "$file_type",
  675. },
  676. "count": map[string]interface{}{"$sum": 1},
  677. },
  678. },
  679. map[string]interface{}{
  680. "$project": map[string]interface{}{
  681. "year": "$_id.year",
  682. "area": "$_id.area",
  683. "count": 1,
  684. "city": "$_id.city",
  685. "district": "$_id.district",
  686. "file_type": "$_id.file_type",
  687. },
  688. },
  689. }
  690. sess3 := MQFW.GetMgoConn()
  691. defer MQFW.DestoryMongoConn(sess3)
  692. it3 := sess3.DB("yusuan").C("yusuan_fileitem").Pipe(pipeline_district).Iter()
  693. for tp := make(map[string]interface{}); it3.Next(&tp); {
  694. log.Println("区县文件:", tp)
  695. area := gconv.String(tp["area"])
  696. city := gconv.String(tp["city"])
  697. count := gconv.Int(tp["count"])
  698. year := gconv.String(tp["year"])
  699. district := gconv.String(tp["district"])
  700. file_type := gconv.String(tp["file_type"])
  701. districtMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city+district)] = gconv.String(count)
  702. tp = make(map[string]interface{})
  703. }
  704. log.Println("结束计算 文件 区县数据。。")
  705. return areaMap, cityMap, districtMap
  706. }
  707. //
  708. func yusuan_purchasing_find_area() (map[string]string, map[string]string, map[string]string) {
  709. //聚合查询语句
  710. areaMap := map[string]string{}
  711. cityMap := map[string]string{}
  712. districtMap := map[string]string{}
  713. log.Println("开始计算 明细 省份数据。。")
  714. pipeline := []map[string]interface{}{
  715. map[string]interface{}{
  716. "$match": map[string]interface{}{
  717. "$expr": map[string]interface{}{
  718. "$eq": []string{"$city", "$area"},
  719. },
  720. },
  721. },
  722. map[string]interface{}{
  723. "$group": map[string]interface{}{
  724. "_id": map[string]interface{}{
  725. "year": "$year",
  726. "area": "$area",
  727. "city": "$city",
  728. "file_type": "$file_type",
  729. },
  730. "count": map[string]interface{}{"$sum": 1},
  731. },
  732. },
  733. map[string]interface{}{
  734. "$project": map[string]interface{}{
  735. "year": "$_id.year",
  736. "area": "$_id.area",
  737. "count": 1,
  738. "file_type": "$_id.file_type",
  739. },
  740. },
  741. }
  742. sess := MQFW.GetMgoConn()
  743. defer MQFW.DestoryMongoConn(sess)
  744. it := sess.DB("yusuan").C("yusuan_purchasing").Pipe(pipeline).Iter()
  745. for tp := make(map[string]interface{}); it.Next(&tp); {
  746. log.Println("省份明细:", tp)
  747. area := gconv.String(tp["area"])
  748. area = municipality("", area)
  749. count := gconv.Int(tp["count"])
  750. year := gconv.String(tp["year"])
  751. file_type := gconv.String(tp["file_type"])
  752. areaMap[fmt.Sprintf("%s_%s_%s", year, file_type, area)] = gconv.String(count)
  753. tp = make(map[string]interface{})
  754. }
  755. log.Println("结束计算 明细 省份数据。。")
  756. log.Println("开始计算 明细 城市数据。。")
  757. //市区
  758. pipeline_city := []map[string]interface{}{
  759. map[string]interface{}{
  760. "$match": map[string]interface{}{
  761. "$or": []map[string]interface{}{
  762. map[string]interface{}{"district": ""},
  763. map[string]interface{}{"district": nil},
  764. map[string]interface{}{"district": map[string]interface{}{"$exists": false}},
  765. },
  766. "$expr": map[string]interface{}{
  767. "$ne": []string{"$city", "$area"},
  768. },
  769. },
  770. },
  771. map[string]interface{}{
  772. "$group": map[string]interface{}{
  773. "_id": map[string]interface{}{
  774. "year": "$year",
  775. "area": "$area",
  776. "city": "$city",
  777. "file_type": "$file_type",
  778. },
  779. "count": map[string]interface{}{"$sum": 1},
  780. },
  781. },
  782. map[string]interface{}{
  783. "$project": map[string]interface{}{
  784. "year": "$_id.year",
  785. "area": "$_id.area",
  786. "city": "$_id.city",
  787. "count": 1,
  788. "file_type": "$_id.file_type",
  789. },
  790. },
  791. }
  792. sess2 := MQFW.GetMgoConn()
  793. defer MQFW.DestoryMongoConn(sess2)
  794. it2 := sess2.DB("yusuan").C("yusuan_purchasing").Pipe(pipeline_city).Iter()
  795. for tp := make(map[string]interface{}); it2.Next(&tp); {
  796. log.Println("城市明细:", tp)
  797. area := gconv.String(tp["area"])
  798. area = municipality(area, "")
  799. city := gconv.String(tp["city"])
  800. count := gconv.Int(tp["count"])
  801. year := gconv.String(tp["year"])
  802. file_type := gconv.String(tp["file_type"])
  803. cityMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city)] = gconv.String(count)
  804. tp = make(map[string]interface{})
  805. }
  806. log.Println("结束计算 明细 城市数据。。")
  807. log.Println("开始计算 明细 区县数据。。")
  808. //区县
  809. pipeline_district := []map[string]interface{}{
  810. map[string]interface{}{
  811. "$match": map[string]interface{}{
  812. "$or": []map[string]interface{}{
  813. map[string]interface{}{
  814. "district": map[string]interface{}{
  815. "$exists": true,
  816. "$nin": []interface{}{nil, ""}},
  817. },
  818. },
  819. "$expr": map[string]interface{}{
  820. "$not": map[string]interface{}{
  821. "$regexMatch": map[string]interface{}{
  822. "input": "$district",
  823. "regex": "[0-9]",
  824. },
  825. },
  826. },
  827. },
  828. },
  829. map[string]interface{}{
  830. "$group": map[string]interface{}{
  831. "_id": map[string]interface{}{
  832. "year": "$year",
  833. "area": "$area",
  834. "city": "$city",
  835. "district": "$district",
  836. "file_type": "$file_type",
  837. },
  838. "count": map[string]interface{}{"$sum": 1},
  839. },
  840. },
  841. map[string]interface{}{
  842. "$project": map[string]interface{}{
  843. "year": "$_id.year",
  844. "area": "$_id.area",
  845. "count": 1,
  846. "city": "$_id.city",
  847. "district": "$_id.district",
  848. "file_type": "$_id.file_type",
  849. },
  850. },
  851. }
  852. sess3 := MQFW.GetMgoConn()
  853. defer MQFW.DestoryMongoConn(sess3)
  854. it3 := sess3.DB("yusuan").C("yusuan_purchasing").Pipe(pipeline_district).Iter()
  855. for tp := make(map[string]interface{}); it3.Next(&tp); {
  856. log.Println("区县明细:", tp)
  857. area := gconv.String(tp["area"])
  858. city := gconv.String(tp["city"])
  859. count := gconv.Int(tp["count"])
  860. year := gconv.String(tp["year"])
  861. district := gconv.String(tp["district"])
  862. file_type := gconv.String(tp["file_type"])
  863. districtMap[fmt.Sprintf("%s_%s_%s", year, file_type, area+city+district)] = gconv.String(count)
  864. tp = make(map[string]interface{})
  865. }
  866. log.Println("结束计算 明细 区县数据。。")
  867. return areaMap, cityMap, districtMap
  868. }
  869. //直辖市转换
  870. func municipality(city, area string) string {
  871. m := map[string]bool{
  872. "上海": true,
  873. "北京": true,
  874. "天津": true,
  875. "重庆": true,
  876. "中央": true,
  877. }
  878. if m[city] {
  879. return city + city + "市"
  880. }
  881. if m[area] {
  882. return area + area
  883. }
  884. if city != "" {
  885. return city
  886. }
  887. if area != "" {
  888. return area
  889. }
  890. return ""
  891. }