package svc import ( "applet/app/admin/md" "applet/app/db" "applet/app/db/model" "applet/app/utils" "applet/app/utils/logx" "encoding/json" "github.com/360EntSecGroup-Skylar/excelize" "strconv" "time" ) func DataStatisticsExport(req md.DataStatisticsExportReq) { var fileName, downloadPath string var now = time.Now() switch req.Kind { case 1: //商品销售明细表 fileName = "商品销售明细表_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "./data/export/" + fileName //查询数据 eg := db.Db list, _ := db.GetOrderListExport(eg, map[string]string{ "start_at": req.StartDate, "end_at": req.EndDate, "enterprise_id": strconv.Itoa(req.EnterpriseId), "start_at_for_date": utils.TimeParseStd(req.DateForStartDate).Format("20060102"), "end_at_for_date": utils.TimeParseStd(req.DateForEndDate).Format("20060102"), }) xlsx, _ := excelize.OpenFile("./static/template/商品销售明细表.xlsx") var data = map[string]map[int64]map[string]string{} if list != nil { enterpriseIds := make([]int, 0) for _, v := range *list { enterpriseIds = append(enterpriseIds, v.EnterpriseId) } enterpriseMap := db.GetEnterpriseMore(eg, enterpriseIds) for _, v := range *list { enterpriseName := "-" _, ok := enterpriseMap[v.EnterpriseId] if ok { enterpriseName = enterpriseMap[v.EnterpriseId].Name } if data[enterpriseName] == nil { data[enterpriseName] = make(map[int64]map[string]string) } if data[enterpriseName][v.Oid] == nil { data[enterpriseName][v.Oid] = make(map[string]string) } //TODO:: 查找 `order_goods` var orderGoods []model.OrderGoods err := eg.Where("oid = ? and goods_type=0", v.Oid).Find(&orderGoods) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } for _, vv := range orderGoods { data[enterpriseName][v.Oid]["date"] = v.CreateAt.Format("2006-01-02") data[enterpriseName][v.Oid]["goods_name"] = vv.GoodsTitle skuData := make([]md.Sku, 0) json.Unmarshal([]byte(vv.Sku), &skuData) skuStr := "" for _, v1 := range skuData { if skuStr != "" { skuStr += ";" } skuStr += v1.Value } data[enterpriseName][v.Oid]["sku_str"] = skuStr data[enterpriseName][v.Oid]["num"] = utils.IntToStr(vv.Num) } } } sheetIndex := 2 //第一个表是模板表 xlsx.NewSheet("Sheet1") //新建表格 xlsx.CopySheet(1, sheetIndex) xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(2), &[]interface{}{ "日期:" + utils.TimeParseStd(req.StartDate).Format("2006-01-02") + " ~ " + utils.TimeParseStd(req.EndDate).Format("2006-01-02"), }) j := 4 //表头前三行被占用了,只能从第四行开始 for k, v := range data { var total = 0 for kk, vv := range v { xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{ vv["date"], utils.Int64ToStr(kk), k, vv["goods_name"], vv["sku_str"], vv["num"], }) xlsx.SetRowHeight("Sheet1", j, 18) total += utils.StrToInt(vv["num"]) j++ } style, err := xlsx.NewStyle(`{"fill":{"type":"pattern","color":["FFFFCC"],"pattern":1}, "alignment":{"horizontal":"center", "vertical": "center"}}`) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } xlsx.MergeCell("Sheet1", "A"+strconv.Itoa(j), "F"+strconv.Itoa(j)) //合并单元格 xlsx.SetCellStyle("Sheet1", "A"+strconv.Itoa(j), "F"+strconv.Itoa(j), style) xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{ k + " 汇总: " + utils.IntToStr(total), }) xlsx.SetRowHeight("Sheet1", j, 20) j++ } xlsx.DeleteSheet("template") //删除模板表 //将文件保存至服务器 xlsx.SaveAs(downloadPath) break case 2: //对账单 fileName = "对账单_" + utils.Int64ToStr(now.UnixMilli()) + ".xlsx" downloadPath = "./data/export/" + fileName //查询数据 eg := db.Db list, _ := db.GetOrderListExport(eg, map[string]string{ "start_at": req.StartDate, "end_at": req.EndDate, "enterprise_id": strconv.Itoa(req.EnterpriseId), "start_at_for_date": utils.TimeParseStd(req.DateForStartDate).Format("20060102"), "end_at_for_date": utils.TimeParseStd(req.DateForEndDate).Format("20060102"), }) xlsx, _ := excelize.OpenFile("./static/template/对账单.xlsx") var data = map[string]map[int64]map[string]string{} if list != nil { enterpriseIds := make([]int, 0) for _, v := range *list { enterpriseIds = append(enterpriseIds, v.EnterpriseId) } enterpriseMap := db.GetEnterpriseMore(eg, enterpriseIds) for _, v := range *list { enterpriseName := "-" _, ok := enterpriseMap[v.EnterpriseId] if ok { enterpriseName = enterpriseMap[v.EnterpriseId].Name } if data[enterpriseName] == nil { data[enterpriseName] = make(map[int64]map[string]string) } if data[enterpriseName][v.Oid] == nil { data[enterpriseName][v.Oid] = make(map[string]string) } //TODO:: 查找 `order_goods` var orderGoods []model.OrderGoods err := eg.Where("oid = ? and goods_type=0", v.Oid).Find(&orderGoods) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) return } for _, vv := range orderGoods { data[enterpriseName][v.Oid]["date"] = v.CreateAt.Format("2006-01-02") data[enterpriseName][v.Oid]["goods_name"] = vv.GoodsTitle data[enterpriseName][v.Oid]["ord_no"] = vv.OrdNo skuData := make([]md.Sku, 0) json.Unmarshal([]byte(vv.Sku), &skuData) skuStr := "" for _, v1 := range skuData { if skuStr != "" { skuStr += ";" } skuStr += v1.Value } data[enterpriseName][v.Oid]["sku_str"] = skuStr data[enterpriseName][v.Oid]["num"] = utils.IntToStr(vv.Num) data[enterpriseName][v.Oid]["price"] = vv.Price } } } sheetIndex := 2 //第一个表是模板表 for k, v := range data { xlsx.NewSheet(k) //新建表格 xlsx.CopySheet(1, sheetIndex) xlsx.SetSheetRow(k, "A"+strconv.Itoa(2), &[]interface{}{ "客户: " + k, }) xlsx.SetSheetRow(k, "A"+strconv.Itoa(5), &[]interface{}{ "对账单日期:" + utils.TimeParseStd(req.StartDate).Format("2006-01-02") + " ~ " + utils.TimeParseStd(req.EndDate).Format("2006-01-02"), }) j := 7 //表头前三行被占用了,只能从第四行开始 var total, totalAmount float64 for kk, vv := range v { if vv["ord_no"] == "" { vv["ord_no"] = utils.Int64ToStr(kk) } amount := utils.StrToFloat64(vv["num"]) * utils.StrToFloat64(vv["price"]) xlsx.SetSheetRow(k, "A"+strconv.Itoa(j), &[]interface{}{ vv["date"], vv["ord_no"], k, vv["goods_name"], vv["sku_str"], vv["num"], vv["price"], utils.StrToFloat64(vv["num"]) * utils.StrToFloat64(vv["price"]), }) xlsx.SetRowHeight("k", j, 18) total += utils.StrToFloat64(vv["num"]) totalAmount += amount style, err := xlsx.NewStyle(`{"alignment":{"horizontal":"center", "vertical": "center"}}`) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } xlsx.SetCellStyle(k, "A"+strconv.Itoa(j), "H"+strconv.Itoa(j), style) j++ } style1, err := xlsx.NewStyle(`{"fill":{"type":"pattern","color":["FFFFCC"],"pattern":1}, "alignment":{"horizontal":"center", "vertical": "center"}}`) if err != nil { logx.Error(err) println("<<<>>>>Error:::", err.Error()) panic(err) } xlsx.SetCellStyle(k, "A"+strconv.Itoa(j), "H"+strconv.Itoa(j), style1) xlsx.SetSheetRow(k, "A"+strconv.Itoa(j), &[]interface{}{ "合计", "", "", "", "", total, "", totalAmount, }) xlsx.SetRowHeight("k", j, 20) sheetIndex++ } xlsx.DeleteSheet("template") //删除模板表 //将文件保存至服务器 xlsx.SaveAs(downloadPath) break } //新增数据 exportRecordsDb := db.ExportRecordsDb{} exportRecordsDb.Set() marshal, _ := json.Marshal(req) exportRecordsDb.ExportRecordsExportRecordsInsert(&model.ExportRecords{ Name: fileName, DownloadPath: downloadPath, Kind: req.Kind, ReqContent: string(marshal), CreateAt: now.Format("2006-01-02 15:04:05"), UpdateAt: now.Format("2006-01-02 15:04:05"), }) }