From 885d97f8fd9e7824c52a1bf9553dd96984c468df Mon Sep 17 00:00:00 2001 From: dengbiao Date: Mon, 29 Apr 2024 21:29:58 +0800 Subject: [PATCH] update --- app/admin/svc/order/svc_order_list.go | 205 +++++++++++++++------ app/db/db_order_list.go | 11 +- etc/cfg.yml | 6 +- static/template/商品销售明细表.xlsx | Bin 0 -> 9286 bytes 4 files changed, 158 insertions(+), 64 deletions(-) create mode 100644 static/template/商品销售明细表.xlsx diff --git a/app/admin/svc/order/svc_order_list.go b/app/admin/svc/order/svc_order_list.go index 0e25183..c9750bd 100644 --- a/app/admin/svc/order/svc_order_list.go +++ b/app/admin/svc/order/svc_order_list.go @@ -7,6 +7,7 @@ import ( "applet/app/e" "applet/app/svc" "applet/app/utils" + "applet/app/utils/logx" "encoding/json" "fmt" "github.com/360EntSecGroup-Skylar/excelize" @@ -83,49 +84,92 @@ func OrderExport(c *gin.Context) { } eg := db.Db list, _ := db.GetOrderListExport(eg, args) + xlsx, _ := excelize.OpenFile("./static/template/商品销售明细表.xlsx") - titleList := []string{"订单编号", "金额", "手机号", "企业名称", "学校名称", "状态", "送达时间", "订单时间"} - xlsx := excelize.NewFile() - xlsx.SetSheetRow("Sheet1", "A1", &titleList) - style, err := xlsx.NewStyle(`{"fill":{"type":"pattern","color":["FFFF00"],"pattern":1}, "alignment":{"horizontal":"center"}}`) - if err != nil { - e.OutErr(c, e.ERR, err.Error()) - return - } - xlsx.SetCellStyle("Sheet1", "A1", "M1", style) - xlsx.SetColWidth("Sheet1", "A", "A", 35) - xlsx.SetColWidth("Sheet1", "B", "B", 30) - xlsx.SetColWidth("Sheet1", "C", "E", 15) - xlsx.SetColWidth("Sheet1", "F", "I", 10) - xlsx.SetColWidth("Sheet1", "J", "J", 20) - xlsx.SetColWidth("Sheet1", "K", "K", 10) - xlsx.SetColWidth("Sheet1", "L", "L", 25) - xlsx.SetColWidth("Sheet1", "M", "M", 15) - //表头被第一行用了,只能从第二行开始 - j := 2 - + var data = map[string]map[int64]map[string]string{} if list != nil { - stateArr := []string{"待制作", "制作中", "制作完成", "烘焙完成", "分拣完成", "已取消"} enterpriseIds := make([]int, 0) for _, v := range *list { enterpriseIds = append(enterpriseIds, v.EnterpriseId) } enterpriseMap := db.GetEnterpriseMore(eg, enterpriseIds) + for _, v := range *list { - v1 := JudgePackageOrdOrdState(&v) - enterpriseName := "" + 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 = ?", v.Oid).Find(&orderGoods) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err) + 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(args["start_at"]).Format("2006-01-02") + " ~ " + utils.TimeParseStd(args["end_at"]).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{}{ - utils.Int64ToStr(v1.Oid), v1.Amount, v1.BuyPhone, enterpriseName, stateArr[v1.State], - gjson.Get(v1.BuyInfo, "date").String() + " " + gjson.Get(v1.BuyInfo, "time").String(), v1.CreateAt.Format("2006-01-02 15:04:05"), + 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") //删除模板表 c.Header("Content-Type", "application/octet-stream") c.Header("Content-Disposition", "attachment; filename="+"订单记录"+".xlsx") @@ -417,49 +461,98 @@ func OrderOutput(c *gin.Context) { } eg := db.Db list := db.GetOrderListOutput(eg, args) + xlsx, _ := excelize.OpenFile("./static/template/商品销售明细表.xlsx") - name := "订单_" + args["page"] - //写入数据 - data := map[string]string{ - "A1": "购买人手机号", - "B1": "学校名称", - "C1": "订单编号", - "D1": "总金额", - "E1": "订单状态", - "F1": "送达时间", - "G1": "下单时间", - } + var data = map[string]map[int64]map[string]string{} if list != nil { - stateArr := []string{"待制作", "制作中", "制作完成", "烘焙完成", "分拣完成", "已取消"} enterpriseIds := make([]int, 0) for _, v := range *list { enterpriseIds = append(enterpriseIds, v.EnterpriseId) } enterpriseMap := db.GetEnterpriseMore(eg, enterpriseIds) - for k, v := range *list { - v1 := v - enterpriseName := "" + + for _, v := range *list { + enterpriseName := "-" _, ok := enterpriseMap[v.EnterpriseId] if ok { enterpriseName = enterpriseMap[v.EnterpriseId].Name } - i := utils.IntToStr(k + 2) - data["A"+i] = v1.BuyPhone - data["B"+i] = enterpriseName - data["C"+i] = utils.Int64ToStr(v1.Oid) - data["D"+i] = v1.Amount - data["E"+i] = stateArr[v1.State] - data["F"+i] = gjson.Get(v1.BuyInfo, "date").String() + " " + gjson.Get(v1.BuyInfo, "time").String() - data["G"+i] = v1.CreateAt.Format("2006-01-02 15:04:05") + 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 = ?", v.Oid).Find(&orderGoods) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err) + 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) + } } } - file := utils.Output(c, name, data) - filename := name + ".xlsx" - r := map[string]string{ - "file": file, - "filename": filename, - } - e.OutSuc(c, r, nil) + + sheetIndex := 2 //第一个表是模板表 + xlsx.NewSheet("Sheet1") //新建表格 + xlsx.CopySheet(1, sheetIndex) + xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(2), &[]interface{}{ + "日期:" + utils.TimeParseStd(args["start_at"]).Format("2006-01-02") + " ~ " + utils.TimeParseStd(args["end_at"]).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") //删除模板表 + + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Disposition", "attachment; filename="+"订单记录"+".xlsx") + c.Header("Content-Transfer-Encoding", "binary") + //回写到web 流媒体 形成下载 + _ = xlsx.Write(c.Writer) return } func OrderEdit(c *gin.Context) { diff --git a/app/db/db_order_list.go b/app/db/db_order_list.go index aa0edb8..30095a6 100644 --- a/app/db/db_order_list.go +++ b/app/db/db_order_list.go @@ -127,6 +127,12 @@ func GetOrderListOutput(eg *xorm.Engine, param map[string]string) *[]model.Order if param["ids"] != "" { sess.In("id", strings.Split(param["ids"], ",")) } + if param["start_at"] != "" { + sess.And("create_at >= ?", param["start_at"]) + } + if param["end_at"] != "" { + sess.And("create_at <= ?", param["end_at"]) + } if param["enterprise_name"] != "" { var enterprise []model.Enterprise eg.Where("name like ?", "%"+param["enterprise_name"]+"%").Find(&enterprise) @@ -136,11 +142,6 @@ func GetOrderListOutput(eg *xorm.Engine, param map[string]string) *[]model.Order } sess.In("enterprise_id", oids) } - size := 10000 - start := (utils.StrToInt(param["page"]) - 1) * size - if param["ids"] == "" { - sess.Limit(size, start) - } err := sess.OrderBy("id asc").Find(&order) if err != nil { return nil diff --git a/etc/cfg.yml b/etc/cfg.yml index a47c022..8549d49 100644 --- a/etc/cfg.yml +++ b/etc/cfg.yml @@ -11,10 +11,10 @@ redis_password: '' # 连接官网数据库获取db mapping db: - host: '119.23.182.117:3306' + host: 'zhios123.rwlb.rds.aliyuncs.com:3306' name: 'bakery' - user: 'root' - psw: 'Fnuo123com@' + user: 'canal' + psw: 'canal' show_log: true max_lifetime: 30 max_open_conns: 100 diff --git a/static/template/商品销售明细表.xlsx b/static/template/商品销售明细表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5ecb9830a842cc8faab9dbad1a58fba69e2048ca GIT binary patch literal 9286 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 literal 0 HcmV?d00001