From 013a52f66b95b03e650949a89cb721dc91c04c02 Mon Sep 17 00:00:00 2001 From: chenlin Date: Thu, 1 Feb 2024 15:36:24 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E5=BA=97=E5=91=98=E7=BB=A9?= =?UTF-8?q?=E6=95=88=E5=AF=BC=E5=87=BAexcel=E5=8A=9F=E8=83=BD=EF=BC=9B=202?= =?UTF-8?q?.=E6=96=B0=E5=A2=9E=E7=A7=9F=E5=8D=A1=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=AF=BC=E5=87=BAexcel=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apis/cooperativemanage/cooperative.go | 8 +- app/admin/models/cooperative_business.go | 194 ++++++++++++++++-- app/admin/models/user.go | 110 ++++++++++ docs/docs.go | 15 +- docs/swagger.json | 15 +- docs/swagger.yaml | 13 +- 6 files changed, 328 insertions(+), 27 deletions(-) diff --git a/app/admin/apis/cooperativemanage/cooperative.go b/app/admin/apis/cooperativemanage/cooperative.go index 00e4ec5..4c9c2af 100644 --- a/app/admin/apis/cooperativemanage/cooperative.go +++ b/app/admin/apis/cooperativemanage/cooperative.go @@ -239,19 +239,13 @@ func CooperativeMemberPromotionStatisticList(c *gin.Context) { return } - list, count, err := req.List() + ret, err := req.List() if err != nil { logger.Errorf("err:", err) app.Error(c, http.StatusInternalServerError, err, "查询失败") return } - ret := models.CooperativeMemberPromotionStatisticListResp{ - Count: count, - PageIndex: req.Page, - List: list, - } - app.OK(c, ret, "") return } diff --git a/app/admin/models/cooperative_business.go b/app/admin/models/cooperative_business.go index 67ff25b..3fed31f 100644 --- a/app/admin/models/cooperative_business.go +++ b/app/admin/models/cooperative_business.go @@ -3,7 +3,9 @@ package models import ( "fmt" "github.com/codinl/go-logger" + "github.com/xuri/excelize/v2" orm "go-admin/common/global" + "go-admin/tools/config" "gorm.io/gorm" "regexp" "strings" @@ -701,7 +703,7 @@ type CooperativeMemberPromotionStatistic struct { RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 - Date string `json:"date" gorm:"index"` // + Date string `json:"date" gorm:"index"` // 日期 StoreId uint32 `json:"store_id" gorm:"index"` // 门店id UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 @@ -724,12 +726,18 @@ type CooperativeMemberPromotionStatisticReq struct { } type CooperativeMemberPromotionStatisticListResp struct { - Count int64 `json:"count"` - PageIndex int `json:"pageIndex"` List []CooperativeMemberPromotionStatistic `json:"list"` + Total int64 `json:"total"` // 总条数 + PageIndex int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 每页展示条数 + ExportUrl string `json:"export_url"` // 导出excel地址 } -func (m *CooperativeMemberPromotionStatisticReq) List() ([]CooperativeMemberPromotionStatistic, int64, error) { +func (m *CooperativeMemberPromotionStatisticReq) List() (*CooperativeMemberPromotionStatisticListResp, error) { + resp := &CooperativeMemberPromotionStatisticListResp{ + PageIndex: m.Page, + PageSize: m.PageSize, + } list := make([]CooperativeMemberPromotionStatistic, 0) page := m.Page - 1 @@ -778,8 +786,11 @@ func (m *CooperativeMemberPromotionStatisticReq) List() ([]CooperativeMemberProm if !endTime.IsZero() { qs = qs.Where("created_at白金", "黄金->黑金", "白金->黑金", "日期"} + for i, _ := range title1 { + cell, _ := excelize.CoordinatesToCellName(1+i, 1) + err := file.SetCellValue(fSheet, cell, title1[i]) + if err != nil { + logger.Error("file set value err:", err) + } + } + + for i, _ := range title2 { + cell, _ := excelize.CoordinatesToCellName(1+i, 2) + err := file.SetCellValue(fSheet, cell, title2[i]) + if err != nil { + logger.Error("file set value err:", err) + } + } + + var row []interface{} + nExcelStartRow := 0 + + for i := 0; i < len(list); i++ { + row = []interface{}{ + list[i].CooperativeName, // 合作商 + list[i].Store.Name, // 门店名称 + list[i].GoldCount, // 开通会员:黄金会员数量 + list[i].PlatinumCount, // 开通会员:白金会员数量 + list[i].BlackGoldCount, // 开通会员:黑金会员数量 + list[i].RenewalGoldCount, // 续费会员:黄金会员数量 + list[i].RenewalPlatinumCount, // 续费会员:白金会员数量 + list[i].RenewalBlackGoldCount, // 续费会员:黑金会员数量 + list[i].UpgradeGoldToPlatinumCount, // 升级:黄金->白金数量 + list[i].UpgradeGoldToBlackCount, // 升级:黄金->黑金数量 + list[i].UpgradePlatinumToBlackCount, // 升级:白金->黑金数量 + list[i].Date, + } + + for j, _ := range row { + cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+3) + err := file.SetCellValue(fSheet, cell, row[j]) + if err != nil { + logger.Error("file set value err:", err) + } + } + nExcelStartRow++ + } + + // 设置所有单元格的样式: 居中、加边框 + style, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + // 设置单元格的样式: 居中、加边框、自动换行 + style1, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center","wrap_text":true}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + endRow := fmt.Sprintf("L%d", nExcelStartRow+2) + // 合并单元格 + _ = file.MergeCell(fSheet, "A1", "A2") + _ = file.MergeCell(fSheet, "B1", "B2") + _ = file.MergeCell(fSheet, "C1", "E1") + _ = file.MergeCell(fSheet, "F1", "H1") + _ = file.MergeCell(fSheet, "I1", "K1") + _ = file.MergeCell(fSheet, "L1", "L2") + //设置单元格高度 + file.SetRowHeight("Sheet1", 1, 18) + file.SetRowHeight("Sheet1", 2, 18) + // 设置单元格大小 + file.SetColWidth("Sheet1", "A", "A", 15) + file.SetColWidth("Sheet1", "B", "B", 20) + // 从列 C 到列 K,逐一设置宽度为 20 + for col := 'C'; col <= 'K'; col++ { + colName := string(col) + file.SetColWidth("Sheet1", colName, colName, 12) + } + // 应用样式到整个表格 + _ = file.SetCellStyle("Sheet1", "A1", "L1", style1) + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) + + fmt.Println("save fileName:", config.ExportConfig.Path+fileName) + if err := file.SaveAs(config.ExportConfig.Path + fileName); err != nil { + fmt.Println(err) + } + return url + fileName, nil } func CooperativeMemberPromotionDayListToStatistic(list []CooperativeMemberPromotionDay) []CooperativeMemberPromotionStatistic { diff --git a/app/admin/models/user.go b/app/admin/models/user.go index 8333993..03c7f3c 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -2648,6 +2648,116 @@ func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, er return memberReport, count, nil } +// 店员绩效导出excel +func inviteMemberReport(list []InviteMemberReport) (string, error) { + file := excelize.NewFile() + fSheet := "Sheet1" + + url := ExportUrl + fileName := time.Now().Format(TimeFormat) + "店员绩效" + ".xlsx" + fmt.Println("url fileName:", url+fileName) + + title1 := []interface{}{"昵称", "小程序ID", "合作商", "门店", + "开通会员数", "开通会员数", "开通会员数", "开通会员数", "开通会员数", + "续费会员数(干预)", "续费会员数(干预)", "续费会员数(干预)", + "升级会员数(干预)", "升级会员数(干预)", "升级会员数(干预)", + "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", + "升级会员数(自动)", "升级会员数(自动)", "升级会员数(自动)"} + title2 := []interface{}{"昵称", "小程序ID", "合作商", "门店", + "年费黄金会员_数量", "半年黄金", "季度黄金", "年费白金会员_数量", "年费黑金会员_数量", + "年费黄金", "年费白金", "年费黑金", + "黄金->白金", "黄金->黑金", "白金->黑金", + "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", "续费会员数(自动)", + "升级会员数(自动)", "升级会员数(自动)", "升级会员数(自动)"} + for i, _ := range title1 { + cell, _ := excelize.CoordinatesToCellName(1+i, 1) + err := file.SetCellValue(fSheet, cell, title1[i]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + + for i, _ := range title2 { + cell, _ := excelize.CoordinatesToCellName(1+i, 2) + err := file.SetCellValue(fSheet, cell, title2[i]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + + var row []interface{} + nExcelStartRow := 0 + + for i := 0; i < len(list); i++ { + row = []interface{}{ + list[i].CooperativeName, // 合作商 + list[i].Store.Name, // 门店名称 + list[i].GoldCount, // 开通会员:黄金会员数量 + list[i].PlatinumCount, // 开通会员:白金会员数量 + list[i].BlackGoldCount, // 开通会员:黑金会员数量 + list[i].RenewalGoldCount, // 续费会员:黄金会员数量 + list[i].RenewalPlatinumCount, // 续费会员:白金会员数量 + list[i].RenewalBlackGoldCount, // 续费会员:黑金会员数量 + list[i].UpgradeGoldToPlatinumCount, // 升级:黄金->白金数量 + list[i].UpgradeGoldToBlackCount, // 升级:黄金->黑金数量 + list[i].UpgradePlatinumToBlackCount, // 升级:白金->黑金数量 + list[i].Date, + } + + for j, _ := range row { + cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+3) + err := file.SetCellValue(fSheet, cell, row[j]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + nExcelStartRow++ + } + + // 设置所有单元格的样式: 居中、加边框 + style, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + // 设置单元格的样式: 居中、加边框、自动换行 + style1, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center","wrap_text":true}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + endRow := fmt.Sprintf("L%d", nExcelStartRow+2) + // 合并单元格 + _ = file.MergeCell(fSheet, "A1", "A2") + _ = file.MergeCell(fSheet, "B1", "B2") + _ = file.MergeCell(fSheet, "C1", "E1") + _ = file.MergeCell(fSheet, "F1", "H1") + _ = file.MergeCell(fSheet, "I1", "K1") + _ = file.MergeCell(fSheet, "L1", "L2") + //设置单元格高度 + file.SetRowHeight("Sheet1", 1, 18) + file.SetRowHeight("Sheet1", 2, 18) + // 设置单元格大小 + file.SetColWidth("Sheet1", "A", "A", 15) + file.SetColWidth("Sheet1", "B", "B", 20) + // 从列 C 到列 K,逐一设置宽度为 20 + for col := 'C'; col <= 'K'; col++ { + colName := string(col) + file.SetColWidth("Sheet1", colName, colName, 12) + } + // 应用样式到整个表格 + _ = file.SetCellStyle("Sheet1", "A1", "L1", style1) + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) + + fmt.Println("save fileName:", config.ExportConfig.Path+fileName) + if err := file.SaveAs(config.ExportConfig.Path + fileName); err != nil { + fmt.Println(err) + } + return url + fileName, nil +} + func InviteMemberReportListSetUser(list []InviteMemberReport) []InviteMemberReport { ids := make([]uint32, 0, len(list)) for i, _ := range list { diff --git a/docs/docs.go b/docs/docs.go index bdd8179..83862e3 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -5368,6 +5368,7 @@ const docTemplate = `{ "type": "string" }, "date": { + "description": "日期", "type": "string" }, "day_time": { @@ -5421,8 +5422,9 @@ const docTemplate = `{ "models.CooperativeMemberPromotionStatisticListResp": { "type": "object", "properties": { - "count": { - "type": "integer" + "export_url": { + "description": "导出excel地址", + "type": "string" }, "list": { "type": "array", @@ -5431,6 +5433,15 @@ const docTemplate = `{ } }, "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页展示条数", + "type": "integer" + }, + "total": { + "description": "总条数", "type": "integer" } } diff --git a/docs/swagger.json b/docs/swagger.json index d3168e3..c85a173 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -5357,6 +5357,7 @@ "type": "string" }, "date": { + "description": "日期", "type": "string" }, "day_time": { @@ -5410,8 +5411,9 @@ "models.CooperativeMemberPromotionStatisticListResp": { "type": "object", "properties": { - "count": { - "type": "integer" + "export_url": { + "description": "导出excel地址", + "type": "string" }, "list": { "type": "array", @@ -5420,6 +5422,15 @@ } }, "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页展示条数", + "type": "integer" + }, + "total": { + "description": "总条数", "type": "integer" } } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index aaa87ae..26698c8 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -757,6 +757,7 @@ definitions: description: 创建时间 type: string date: + description: 日期 type: string day_time: type: string @@ -795,13 +796,21 @@ definitions: type: object models.CooperativeMemberPromotionStatisticListResp: properties: - count: - type: integer + export_url: + description: 导出excel地址 + type: string list: items: $ref: '#/definitions/models.CooperativeMemberPromotionStatistic' type: array pageIndex: + description: 页码 + type: integer + pageSize: + description: 每页展示条数 + type: integer + total: + description: 总条数 type: integer type: object models.CooperativeMemberPromotionStatisticReq: