From bee5d75278d94cd8340f71c19eee5fa9565143dd Mon Sep 17 00:00:00 2001 From: huangjiajun <582604932@qq.com> Date: Mon, 3 Jun 2024 18:01:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/hdl/order/hdl_order_list.go | 3 + app/admin/svc/order/svc_order_list.go | 125 +++++++++++++++++++++ app/db/db_order_goods_list.go | 9 ++ app/db/db_order_list.go | 2 +- app/router/admin_router.go | 31 ++--- static/template/订单品类明细表.xlsx | Bin 0 -> 9266 bytes 6 files changed, 154 insertions(+), 16 deletions(-) create mode 100644 static/template/订单品类明细表.xlsx diff --git a/app/admin/hdl/order/hdl_order_list.go b/app/admin/hdl/order/hdl_order_list.go index 3188575..0f3a2c2 100644 --- a/app/admin/hdl/order/hdl_order_list.go +++ b/app/admin/hdl/order/hdl_order_list.go @@ -28,6 +28,9 @@ func OrderDetail(c *gin.Context) { func OrderOutput(c *gin.Context) { order.OrderOutput(c) } +func OrderGoodsOutput(c *gin.Context) { + order.OrderGoodsOutput(c) +} func OrderEdit(c *gin.Context) { order.OrderEdit(c) } diff --git a/app/admin/svc/order/svc_order_list.go b/app/admin/svc/order/svc_order_list.go index 2743255..d10d201 100644 --- a/app/admin/svc/order/svc_order_list.go +++ b/app/admin/svc/order/svc_order_list.go @@ -640,6 +640,131 @@ func OrderOutput(c *gin.Context) { _ = xlsx.Write(c.Writer) return } +func OrderGoodsOutput(c *gin.Context) { + var args map[string]string + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + eg := db.Db + list := db.GetOrderListOutput(eg, args) + xlsx, _ := excelize.OpenFile("./static/template/订单品类明细表.xlsx") + + var data = map[string]map[string][]map[string]string{} + var enterpriseMap = make(map[int]model.Enterprise) + enterpriseIds := make([]int, 0) + dateList := make([]string, 0) + + oids := make([]int64, 0) + + if list != nil { + ordMap := make(map[int64]model.Order) + for _, v := range *list { + _, ok := ordMap[v.Oid] + if ok == false { + ordMap[v.Oid] = model.Order{} + } + ordMap[v.Oid] = v + oids = append(oids, v.Oid) + enterpriseIds = append(enterpriseIds, v.EnterpriseId) + } + enterpriseMap = db.GetEnterpriseMore(eg, enterpriseIds) + + ord := db.GetOrderGoodsByOid(eg, oids) + + for _, v := range *ord { + dateStr := ordMap[v.Oid].CreateAt.Format("2006-01-02") + if utils.InArr(dateStr, dateList) == false { + dateList = append(dateList, dateStr) + } + if data[dateStr] == nil { + data[dateStr] = make(map[string][]map[string]string) + } + gidStr := utils.Int64ToStr(v.GoodsId) + "_" + utils.Int64ToStr(v.SkuId) + if data[dateStr][gidStr] == nil { + data[dateStr][gidStr] = make([]map[string]string, 0) + } + + tmp := make(map[string]string) + tmp["date"] = ordMap[v.Oid].CreateAt.Format("2006-01-02") + tmp["send_date"] = gjson.Get(ordMap[v.Oid].BuyInfo, "date").String() + tmp["goods_name"] = v.GoodsTitle + tmp["make_date"] = utils.TimeParseDateStd1(v.MakeDate) + if v.OrdNo == "" { + v.OrdNo = utils.Int64ToStr(v.Oid) + } + tmp["ord_no"] = v.OrdNo + tmp["goods_type"] = utils.IntToStr(v.GoodsType) + skuData := make([]md.Sku, 0) + json.Unmarshal([]byte(v.Sku), &skuData) + skuStr := "" + for _, v1 := range skuData { + if skuStr != "" { + skuStr += ";" + } + skuStr += v1.Value + } + tmp["sku_str"] = skuStr + tmp["num"] = utils.IntToStr(v.Num) + inSideName := "" + _, ok := enterpriseMap[v.EnterpriseId] + if ok { + inSideName = enterpriseMap[v.EnterpriseId].InsideName + } + tmp["inSideName"] = inSideName + data[dateStr][gidStr] = append(data[dateStr][gidStr], tmp) + } + } + + 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 _, v0 := range dateList { + for _, v := range data[v0] { + var total = 0 + title := "" + for _, vv := range v { + xlsx.SetSheetRow("Sheet1", "A"+strconv.Itoa(j), &[]interface{}{ + vv["date"], + vv["ord_no"], + vv["inSideName"], + vv["num"], + vv["make_date"], + }) + title = vv["goods_name"] + " " + vv["sku_st"] + 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{}{ + title + " 汇总: " + 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) { var args map[string]string if err := c.ShouldBindJSON(&args); err != nil { diff --git a/app/db/db_order_goods_list.go b/app/db/db_order_goods_list.go index c5981b2..ce84192 100644 --- a/app/db/db_order_goods_list.go +++ b/app/db/db_order_goods_list.go @@ -75,3 +75,12 @@ func GetOrderGoodsAll(sess *xorm.Session, oid string) *[]model.OrderGoods { } return &order } + +func GetOrderGoodsByOid(eg *xorm.Engine, oid []int64) *[]model.OrderGoods { + var order []model.OrderGoods + err := eg.In("oid", oid).And("goods_type=0").Find(&order) + if err != nil { + return nil + } + return &order +} diff --git a/app/db/db_order_list.go b/app/db/db_order_list.go index 7f20b44..4c67678 100644 --- a/app/db/db_order_list.go +++ b/app/db/db_order_list.go @@ -175,7 +175,7 @@ func GetOrderListOutput(eg *xorm.Engine, param map[string]string) *[]model.Order } sess.In("enterprise_id", oids) } - err := sess.OrderBy("id desc").Find(&order) + err := sess.OrderBy("id asc").Find(&order) if err != nil { return nil } diff --git a/app/router/admin_router.go b/app/router/admin_router.go index e947e9c..27747a1 100644 --- a/app/router/admin_router.go +++ b/app/router/admin_router.go @@ -136,21 +136,22 @@ func rGoodsPay(r *gin.RouterGroup) { r.POST("/create", orderHdl.GoodsPayCreate) //商品下单 } func rOrder(r *gin.RouterGroup) { - r.POST("/list", orderHdl.OrderList) //用户订单 - r.POST("/total", orderHdl.OrderTotal) //用户订单统计 - r.POST("/cancel", orderHdl.OrderCancel) //用户订单取消 - r.POST("/detail", orderHdl.OrderDetail) //用户订单详情 - r.POST("/output", orderHdl.OrderOutput) //用户订单导出 - r.POST("/del", orderHdl.OrderDel) //用户订单商品删除 - r.POST("/edit", orderHdl.OrderEdit) //用户订单修改购买人信息 - r.POST("/editNum", orderHdl.OrderEditNum) //用户订单修改订单数 - r.POST("/addSku", orderHdl.OrderAddSku) //用户订单修改订单数 - r.POST("/addNum", orderHdl.OrderAddNum) //用户订单增加数量 - r.POST("/deductNum", orderHdl.OrderDeductNum) //用户订单减少数量 - r.POST("/makeRecord", orderHdl.MarkRecord) //制作记录 - r.POST("/notice", orderHdl.NoticeList) //公告 - r.POST("/notice_save", orderHdl.NoticeSave) //公告 - r.POST("/notice_del", orderHdl.NoticeDel) //公告 + r.POST("/list", orderHdl.OrderList) //用户订单 + r.POST("/total", orderHdl.OrderTotal) //用户订单统计 + r.POST("/cancel", orderHdl.OrderCancel) //用户订单取消 + r.POST("/detail", orderHdl.OrderDetail) //用户订单详情 + r.POST("/output", orderHdl.OrderOutput) //用户订单导出 + r.POST("/goods/output", orderHdl.OrderGoodsOutput) //用户订单导出 + r.POST("/del", orderHdl.OrderDel) //用户订单商品删除 + r.POST("/edit", orderHdl.OrderEdit) //用户订单修改购买人信息 + r.POST("/editNum", orderHdl.OrderEditNum) //用户订单修改订单数 + r.POST("/addSku", orderHdl.OrderAddSku) //用户订单修改订单数 + r.POST("/addNum", orderHdl.OrderAddNum) //用户订单增加数量 + r.POST("/deductNum", orderHdl.OrderDeductNum) //用户订单减少数量 + r.POST("/makeRecord", orderHdl.MarkRecord) //制作记录 + r.POST("/notice", orderHdl.NoticeList) //公告 + r.POST("/notice_save", orderHdl.NoticeSave) //公告 + r.POST("/notice_del", orderHdl.NoticeDel) //公告 } func rDataStatistics(r *gin.RouterGroup) { diff --git a/static/template/订单品类明细表.xlsx b/static/template/订单品类明细表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fc4bcf5d4e0d46c7c7cff50d7fde6e76b80f324a GIT binary patch literal 9266 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 z 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 K96sfP-v0x;WZWSD literal 0 HcmV?d00001