report.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. package api
  2. import (
  3. "box-cost/db/model"
  4. "box-cost/db/repo"
  5. "errors"
  6. "fmt"
  7. "strings"
  8. "time"
  9. "github.com/gin-gonic/gin"
  10. "github.com/go-redis/redis/v8"
  11. "github.com/xuri/excelize/v2"
  12. "go.mongodb.org/mongo-driver/bson/primitive"
  13. )
  14. // 统计报表 按时间范围,供应商 包装-计划(多选) 维度进行过滤,形成报表。可以下载
  15. func Report(r *GinRouter) {
  16. // 加工列表
  17. r.GET("/report/produce/list", ReportProduceList)
  18. // 采购列表
  19. r.GET("/report/purchase/list", ReportPurchaseList)
  20. r.GET("/report/product/list", ReportProductList)
  21. r.GET("/report/produce/download", ReportProduceDownload)
  22. r.GET("/report/purchase/download", ReportPurchaseDownload)
  23. r.GET("/report/product/download", ReportProductDownload)
  24. r.GETJWT("/report/list", ReportList)
  25. r.GETJWT("/report/download", ReportListDownload)
  26. }
  27. // 加工单
  28. func ReportListDownload(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  29. page, size, query := UtilQueryPageSize(c)
  30. // start, stop := CreatePageRange(page, size)
  31. supplierId := primitive.NilObjectID
  32. if _supplierId, ok := query["supplierId"]; ok {
  33. supplierId, _ = primitive.ObjectIDFromHex(_supplierId.(string))
  34. }
  35. timeRange := []interface{}{}
  36. if _timeRange, ok := query["timeRange"]; ok {
  37. timeRange, _ = _timeRange.([]interface{})
  38. }
  39. filtter := handleReportQuery(query)
  40. purchases := []*model.PurchaseBill{}
  41. produces := []*model.ProduceBill{}
  42. products := []*model.ProductBill{}
  43. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  44. CollectName: repo.CollectionBillPurchase,
  45. Query: filtter,
  46. Project: []string{"_id", "completeTime"},
  47. }, &purchases)
  48. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  49. CollectName: repo.CollectionBillProduce,
  50. Query: filtter,
  51. Project: []string{"_id", "completeTime"},
  52. }, &produces)
  53. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  54. CollectName: repo.CollectionBillProduct,
  55. Query: filtter,
  56. Project: []string{"_id", "completeTime"},
  57. }, &products)
  58. // 加入redis有序集合中
  59. redisCli := apictx.Svc.Redis
  60. reportBillKey := "report-bill-list:" + apictx.User.Parent
  61. isExist := redisCli.Exists(apictx.CreateRepoCtx().Ctx, reportBillKey).Val()
  62. // 不存在这个key时
  63. if isExist < 1 {
  64. if len(purchases) > 0 {
  65. for _, purchase := range purchases {
  66. member := "purchase_" + purchase.Id.Hex()
  67. score := purchase.CompleteTime.Unix()
  68. redisCli.ZAdd(apictx.CreateRepoCtx().Ctx, reportBillKey, &redis.Z{Score: float64(score), Member: member})
  69. }
  70. }
  71. if len(produces) > 0 {
  72. for _, produce := range produces {
  73. member := "produce_" + produce.Id.Hex()
  74. score := produce.CompleteTime.Unix()
  75. redisCli.ZAdd(apictx.CreateRepoCtx().Ctx, reportBillKey, &redis.Z{Score: float64(score), Member: member})
  76. }
  77. }
  78. if len(products) > 0 {
  79. for _, product := range products {
  80. member := "product_" + product.Id.Hex()
  81. score := product.CompleteTime.Unix()
  82. redisCli.ZAdd(apictx.CreateRepoCtx().Ctx, reportBillKey, &redis.Z{Score: float64(score), Member: member})
  83. }
  84. }
  85. // 设置过期时间
  86. redisCli.Expire(apictx.CreateRepoCtx().Ctx, reportBillKey, 20*time.Second)
  87. }
  88. total, err := redisCli.ZCard(apictx.CreateRepoCtx().Ctx, reportBillKey).Uint64()
  89. fmt.Println(total)
  90. if err != nil {
  91. fmt.Println(err)
  92. return nil, err
  93. }
  94. reports, err := redisCli.ZRevRange(apictx.CreateRepoCtx().Ctx, reportBillKey, 0, -1).Result()
  95. if err != nil {
  96. return nil, err
  97. }
  98. if len(reports) < 1 {
  99. return repo.PageResult{
  100. Page: page,
  101. Size: size,
  102. Total: 0,
  103. }, nil
  104. }
  105. lists := []map[string]interface{}{}
  106. for _, report := range reports {
  107. billArray := strings.Split(report, "_")
  108. billType := billArray[0]
  109. _billId := billArray[1]
  110. billId, _ := primitive.ObjectIDFromHex(_billId)
  111. billData := map[string]interface{}{}
  112. found := false
  113. if billType == "purchase" {
  114. found, billData = repo.RepoSeachDocMap(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  115. CollectName: repo.CollectionBillPurchase,
  116. Query: repo.Map{"_id": billId},
  117. })
  118. }
  119. if billType == "produce" {
  120. found, billData = repo.RepoSeachDocMap(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  121. CollectName: repo.CollectionBillProduce,
  122. Query: repo.Map{"_id": billId},
  123. })
  124. }
  125. if billType == "product" {
  126. found, billData = repo.RepoSeachDocMap(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  127. CollectName: repo.CollectionBillProduct,
  128. Query: repo.Map{"_id": billId},
  129. })
  130. }
  131. if found {
  132. billData["billType"] = billType
  133. lists = append(lists, billData)
  134. }
  135. }
  136. f := excelize.NewFile()
  137. index := f.NewSheet("Sheet1")
  138. f.SetActiveSheet(index)
  139. f.SetDefaultFont("宋体")
  140. report := NewReportExcel(f)
  141. supplier := model.Supplier{}
  142. supplierName := "【所有供应商】"
  143. if !supplierId.IsZero() {
  144. repo.RepoSeachDoc(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  145. CollectName: repo.CollectionSupplier,
  146. Query: repo.Map{"supplierId": supplierId},
  147. Project: []string{"name"},
  148. }, &supplier)
  149. supplierName = supplier.Name
  150. }
  151. report.SupplierName = supplierName
  152. if len(timeRange) == 2 {
  153. report.TimeRange = append(report.TimeRange, timeRange[0].(string), timeRange[1].(string))
  154. }
  155. report.Content = lists
  156. report.Draws()
  157. c.Header("Content-Type", "application/octet-stream")
  158. c.Header("Content-Disposition", "attachment; filename="+"report.xlsx")
  159. c.Header("Content-Transfer-Encoding", "binary")
  160. err = f.Write(c.Writer)
  161. if err != nil {
  162. return nil, err
  163. }
  164. return nil, nil
  165. }
  166. // 加工单
  167. func ReportList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  168. page, size, query := UtilQueryPageSize(c)
  169. start, stop := CreatePageRange(page, size)
  170. filtter := handleReportQuery(query)
  171. purchases := []*model.PurchaseBill{}
  172. produces := []*model.ProduceBill{}
  173. products := []*model.ProductBill{}
  174. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  175. CollectName: repo.CollectionBillPurchase,
  176. Query: filtter,
  177. Project: []string{"_id", "completeTime"},
  178. }, &purchases)
  179. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  180. CollectName: repo.CollectionBillProduce,
  181. Query: filtter,
  182. Project: []string{"_id", "completeTime"},
  183. }, &produces)
  184. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  185. CollectName: repo.CollectionBillProduct,
  186. Query: filtter,
  187. Project: []string{"_id", "completeTime"},
  188. }, &products)
  189. // 加入redis有序集合中
  190. redisCli := apictx.Svc.Redis
  191. reportBillKey := "report-bill-list:" + apictx.User.Parent
  192. isExist := redisCli.Exists(apictx.CreateRepoCtx().Ctx, reportBillKey).Val()
  193. // 不存在这个key时
  194. if isExist < 1 {
  195. if len(purchases) > 0 {
  196. for _, purchase := range purchases {
  197. member := "purchase_" + purchase.Id.Hex()
  198. score := purchase.CompleteTime.Unix()
  199. redisCli.ZAdd(apictx.CreateRepoCtx().Ctx, reportBillKey, &redis.Z{Score: float64(score), Member: member})
  200. }
  201. }
  202. if len(produces) > 0 {
  203. for _, produce := range produces {
  204. member := "produce_" + produce.Id.Hex()
  205. score := produce.CompleteTime.Unix()
  206. redisCli.ZAdd(apictx.CreateRepoCtx().Ctx, reportBillKey, &redis.Z{Score: float64(score), Member: member})
  207. }
  208. }
  209. if len(products) > 0 {
  210. for _, product := range products {
  211. member := "product_" + product.Id.Hex()
  212. score := product.CompleteTime.Unix()
  213. redisCli.ZAdd(apictx.CreateRepoCtx().Ctx, reportBillKey, &redis.Z{Score: float64(score), Member: member})
  214. }
  215. }
  216. // 设置过期时间
  217. redisCli.Expire(apictx.CreateRepoCtx().Ctx, reportBillKey, 20*time.Second)
  218. }
  219. total, err := redisCli.ZCard(apictx.CreateRepoCtx().Ctx, reportBillKey).Uint64()
  220. if err != nil {
  221. fmt.Println(err)
  222. return nil, err
  223. }
  224. reports, err := redisCli.ZRevRange(apictx.CreateRepoCtx().Ctx, reportBillKey, start, stop).Result()
  225. if err != nil {
  226. return nil, err
  227. }
  228. if len(reports) < 1 {
  229. return repo.PageResult{
  230. Page: page,
  231. Size: size,
  232. Total: 0,
  233. }, nil
  234. }
  235. lists := []map[string]interface{}{}
  236. for _, report := range reports {
  237. billArray := strings.Split(report, "_")
  238. billType := billArray[0]
  239. _billId := billArray[1]
  240. billId, _ := primitive.ObjectIDFromHex(_billId)
  241. billData := map[string]interface{}{}
  242. found := false
  243. if billType == "purchase" {
  244. found, billData = repo.RepoSeachDocMap(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  245. CollectName: repo.CollectionBillPurchase,
  246. Query: repo.Map{"_id": billId},
  247. })
  248. }
  249. if billType == "produce" {
  250. found, billData = repo.RepoSeachDocMap(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  251. CollectName: repo.CollectionBillProduce,
  252. Query: repo.Map{"_id": billId},
  253. })
  254. }
  255. if billType == "product" {
  256. found, billData = repo.RepoSeachDocMap(apictx.CreateRepoCtx(), &repo.DocSearchOptions{
  257. CollectName: repo.CollectionBillProduct,
  258. Query: repo.Map{"_id": billId},
  259. })
  260. }
  261. if found {
  262. billData["billType"] = billType
  263. lists = append(lists, billData)
  264. }
  265. }
  266. return repo.PageResult{
  267. List: lists,
  268. Total: int64(total),
  269. Page: page,
  270. Size: size,
  271. }, nil
  272. }
  273. func CreatePageRange(page, size int64) (int64, int64) {
  274. if page < 1 {
  275. page = 1
  276. }
  277. if size < 1 {
  278. size = 10
  279. }
  280. // var start int64 = 0
  281. // var stop int64 = 9
  282. // if size < 1 {
  283. // return start, stop
  284. // }
  285. // if page > 0 {
  286. start := (page - 1) * size
  287. stop := page*size - 1
  288. // }
  289. return start, stop
  290. }
  291. func ReportProduceList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  292. page, size, query := UtilQueryPageSize(c)
  293. // 条件处理
  294. // 获取采购单符合条件的信息
  295. return repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  296. CollectName: repo.CollectionBillProduce,
  297. Query: handleReportQuery(query),
  298. Page: page,
  299. Size: size,
  300. })
  301. }
  302. // 采购单
  303. func ReportPurchaseList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  304. page, size, query := UtilQueryPageSize(c)
  305. return repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  306. CollectName: repo.CollectionBillPurchase,
  307. Query: handleReportQuery(query),
  308. Page: page,
  309. Size: size,
  310. })
  311. }
  312. func ReportProductList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  313. page, size, query := UtilQueryPageSize(c)
  314. return repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  315. CollectName: repo.CollectionBillProduct,
  316. Query: handleReportQuery(query),
  317. Page: page,
  318. Size: size,
  319. })
  320. }
  321. func ReportProduceDownload(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  322. _, _, query := UtilQueryPageSize(c)
  323. // 获取采符合条件的信息
  324. produces := []*model.ProduceBill{}
  325. err := repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  326. CollectName: repo.CollectionBillProduce,
  327. Query: handleReportQuery(query),
  328. }, &produces)
  329. if err != nil || len(produces) < 1 {
  330. return nil, errors.New("数据不存在")
  331. }
  332. f := excelize.NewFile()
  333. index := f.NewSheet("Sheet1")
  334. sheetName := f.GetSheetName(index)
  335. f.SetActiveSheet(index)
  336. f.SetDefaultFont("宋体")
  337. border := []excelize.Border{
  338. {Type: "top", Style: 1, Color: "000000"},
  339. {Type: "left", Style: 1, Color: "000000"},
  340. {Type: "right", Style: 1, Color: "000000"},
  341. {Type: "bottom", Style: 1, Color: "000000"},
  342. }
  343. alignCenterStyle, _ := f.NewStyle(&excelize.Style{
  344. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  345. Border: border,
  346. })
  347. companyName := getCompanyName(apictx)
  348. var budgetAmount float64 = 0
  349. var realAmount float64 = 0
  350. var row int = 0
  351. for _, produce := range produces {
  352. produceExcel := NewReportProduceExcel(f)
  353. produceExcel.Row = row
  354. produceExcel.Content = produce
  355. produceExcel.Title = fmt.Sprintf("%s加工单", companyName)
  356. //设置对应的数据
  357. produceExcel.Draws()
  358. budgetAmount += produceExcel.BudgetAmount
  359. realAmount += produceExcel.RealAmount
  360. row = produceExcel.Row + 3
  361. }
  362. row = row - 2
  363. startCell := fmt.Sprintf("%s%d", "A", row)
  364. endCell := fmt.Sprintf("%s%d", "H", row)
  365. f.MergeCell(sheetName, startCell, endCell)
  366. f.SetCellStyle(sheetName, startCell, endCell, alignCenterStyle)
  367. f.SetCellValue(sheetName, startCell, "汇总金额")
  368. // 预算金额汇总
  369. budgetAmountCell := fmt.Sprintf("%s%d", "I", row)
  370. budgetAmountStr := ""
  371. if budgetAmount > 0 {
  372. budgetAmountStr = fmt.Sprintf("%.3f", budgetAmount)
  373. }
  374. f.SetCellValue(sheetName, budgetAmountCell, budgetAmountStr)
  375. f.SetCellStyle(sheetName, budgetAmountCell, budgetAmountCell, alignCenterStyle)
  376. // 实际金额汇总
  377. realAmountCell := fmt.Sprintf("%s%d", "J", row)
  378. realAmountStr := ""
  379. if realAmount > 0 {
  380. realAmountStr = fmt.Sprintf("%.3f", realAmount)
  381. }
  382. f.SetCellValue(sheetName, realAmountCell, realAmountStr)
  383. f.SetCellStyle(sheetName, realAmountCell, realAmountCell, alignCenterStyle)
  384. f.SetRowHeight(sheetName, row, 21)
  385. c.Header("Content-Type", "application/octet-stream")
  386. c.Header("Content-Disposition", "attachment; filename="+"reportProduce.xlsx")
  387. c.Header("Content-Transfer-Encoding", "binary")
  388. err = f.Write(c.Writer)
  389. if err != nil {
  390. return nil, err
  391. }
  392. return nil, nil
  393. }
  394. func ReportPurchaseDownload(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  395. _, _, query := UtilQueryPageSize(c)
  396. purchases := []model.PurchaseBill{}
  397. err := repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  398. CollectName: repo.CollectionBillPurchase,
  399. Query: handleReportQuery(query),
  400. }, &purchases)
  401. if err != nil || len(purchases) < 1 {
  402. return nil, errors.New("数据不存在")
  403. }
  404. f := excelize.NewFile()
  405. index := f.NewSheet("Sheet1")
  406. sheetName := f.GetSheetName(index)
  407. f.SetActiveSheet(index)
  408. f.SetDefaultFont("宋体")
  409. border := []excelize.Border{
  410. {Type: "top", Style: 1, Color: "000000"},
  411. {Type: "left", Style: 1, Color: "000000"},
  412. {Type: "right", Style: 1, Color: "000000"},
  413. {Type: "bottom", Style: 1, Color: "000000"},
  414. }
  415. alignCenterStyle, _ := f.NewStyle(&excelize.Style{
  416. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  417. Border: border,
  418. })
  419. companyName := getCompanyName(apictx)
  420. var budgetCount float64 = 0
  421. var realCount float64 = 0
  422. var row int = 0
  423. for _, purchase := range purchases {
  424. var reportBill *ReportPurchaseExcel
  425. if len(purchase.Paper) > 0 {
  426. reportBill = NewReportPurchaseExcel(f)
  427. }
  428. if reportBill == nil {
  429. return nil, errors.New("数据不存在")
  430. }
  431. reportBill.Row = row
  432. reportBill.Content = &purchase
  433. reportBill.Title = fmt.Sprintf("%s原材料采购单", companyName)
  434. reportBill.Draws()
  435. budgetCount += reportBill.BudgetAmount
  436. realCount += reportBill.RealAmount
  437. row = reportBill.Row + 3
  438. }
  439. row = row - 2
  440. startCell := fmt.Sprintf("%s%d", "A", row)
  441. endCell := fmt.Sprintf("%s%d", "H", row)
  442. f.MergeCell(sheetName, startCell, endCell)
  443. f.SetCellStyle(sheetName, startCell, endCell, alignCenterStyle)
  444. f.SetCellValue(sheetName, startCell, "汇总金额")
  445. // 预算金额汇总
  446. budgetCountCell := fmt.Sprintf("%s%d", "I", row)
  447. budgetCountStr := ""
  448. if realCount > 0 {
  449. budgetCountStr = fmt.Sprintf("%.3f", budgetCount)
  450. }
  451. f.SetCellValue(sheetName, budgetCountCell, budgetCountStr)
  452. f.SetCellStyle(sheetName, budgetCountCell, budgetCountCell, alignCenterStyle)
  453. // 实际金额汇总
  454. RealCountCell := fmt.Sprintf("%s%d", "J", row)
  455. realCountStr := ""
  456. if realCount > 0 {
  457. realCountStr = fmt.Sprintf("%.3f", realCount)
  458. }
  459. f.SetCellValue(sheetName, RealCountCell, realCountStr)
  460. f.SetCellStyle(sheetName, RealCountCell, RealCountCell, alignCenterStyle)
  461. f.SetRowHeight(sheetName, row, 21)
  462. c.Header("Content-Type", "application/octet-stream")
  463. c.Header("Content-Disposition", "attachment; filename="+"reportPurchase.xlsx")
  464. c.Header("Content-Transfer-Encoding", "binary")
  465. err = f.Write(c.Writer)
  466. if err != nil {
  467. return nil, err
  468. }
  469. return nil, nil
  470. }
  471. func ReportProductDownload(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  472. _, _, query := UtilQueryPageSize(c)
  473. // 获取采符合条件的信息
  474. products := []*model.ProductBill{}
  475. err := repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  476. CollectName: repo.CollectionBillProduct,
  477. Query: handleReportQuery(query),
  478. }, &products)
  479. if err != nil || len(products) < 1 {
  480. return nil, errors.New("数据不存在")
  481. }
  482. f := excelize.NewFile()
  483. index := f.NewSheet("Sheet1")
  484. sheetName := f.GetSheetName(index)
  485. f.SetActiveSheet(index)
  486. f.SetDefaultFont("宋体")
  487. border := []excelize.Border{
  488. {Type: "top", Style: 1, Color: "000000"},
  489. {Type: "left", Style: 1, Color: "000000"},
  490. {Type: "right", Style: 1, Color: "000000"},
  491. {Type: "bottom", Style: 1, Color: "000000"},
  492. }
  493. alignCenterStyle, _ := f.NewStyle(&excelize.Style{
  494. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  495. Border: border,
  496. })
  497. companyName := getCompanyName(apictx)
  498. var budgetAmount float64 = 0
  499. var realAmount float64 = 0
  500. var row int = 0
  501. for _, product := range products {
  502. productExcel := NewReportProductBill(f)
  503. productExcel.Row = row
  504. productExcel.Content = product
  505. productExcel.Title = companyName
  506. productExcel.Draws()
  507. budgetAmount += productExcel.BudgetAmount
  508. realAmount += productExcel.RealAmount
  509. row = productExcel.Row + 3
  510. }
  511. row = row - 2
  512. startCell := fmt.Sprintf("%s%d", "A", row)
  513. endCell := fmt.Sprintf("%s%d", "H", row)
  514. f.MergeCell(sheetName, startCell, endCell)
  515. f.SetCellStyle(sheetName, startCell, endCell, alignCenterStyle)
  516. f.SetCellValue(sheetName, startCell, "汇总金额")
  517. // 预算金额汇总
  518. budgetAmountCell := fmt.Sprintf("%s%d", "I", row)
  519. budgetCountStr := ""
  520. if realAmount > 0 {
  521. budgetCountStr = fmt.Sprintf("%.3f", realAmount)
  522. }
  523. f.SetCellValue(sheetName, budgetAmountCell, budgetCountStr)
  524. f.SetCellStyle(sheetName, budgetAmountCell, budgetAmountCell, alignCenterStyle)
  525. // 实际金额汇总
  526. realAmountCell := fmt.Sprintf("%s%d", "J", row)
  527. realAmountStr := ""
  528. if realAmount > 0 {
  529. realAmountStr = fmt.Sprintf("%.3f", realAmount)
  530. }
  531. f.SetCellValue(sheetName, realAmountCell, realAmountStr)
  532. f.SetCellStyle(sheetName, realAmountCell, realAmountCell, alignCenterStyle)
  533. f.SetRowHeight(sheetName, row, 21)
  534. c.Header("Content-Type", "application/octet-stream")
  535. c.Header("Content-Disposition", "attachment; filename="+"reportProduce.xlsx")
  536. c.Header("Content-Transfer-Encoding", "binary")
  537. err = f.Write(c.Writer)
  538. if err != nil {
  539. return nil, err
  540. }
  541. return nil, nil
  542. }