From 40666e03c49ebd285638ff2750052d542adc89c3 Mon Sep 17 00:00:00 2001 From: chenlin Date: Fri, 20 Sep 2024 17:05:52 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E9=9B=B6=E5=94=AE?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E5=8D=95=E5=8F=8D=E5=AE=A1=E6=A0=B8=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98=EF=BC=9B=202=E3=80=81=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E9=9B=B6=E5=94=AE=E9=80=80=E8=B4=A7=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=8B=86=E5=88=86=E9=9D=9E=E4=B8=B2=E7=A0=81=E5=95=86=E5=93=81?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=90=8C=E6=AD=A5=E6=8B=86=E5=88=86=E9=80=80?= =?UTF-8?q?=E8=B4=A7=E6=95=B0=E9=87=8F=E5=92=8C=E9=80=80=E8=B4=A7=E9=87=91?= =?UTF-8?q?=E9=A2=9D=E5=AD=97=E6=AE=B5=EF=BC=9B=E9=9B=B6=E5=94=AE=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=90=88=E5=B9=B6=E9=9D=9E=E4=B8=B2=E7=A0=81=E5=95=86?= =?UTF-8?q?=E5=93=81=E6=97=B6=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E9=80=80=E8=B4=A7=E6=95=B0=E9=87=8F=E5=92=8C=E9=80=80=E8=B4=A7?= =?UTF-8?q?=E9=87=91=E9=A2=9D=E5=AD=97=E6=AE=B5=EF=BC=9B=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=90=8E=E8=A7=A3=E5=86=B3=E5=95=86=E5=93=81=E9=9B=B6=E5=94=AE?= =?UTF-8?q?=E6=AF=9B=E5=88=A9=E6=B1=87=E6=80=BB=E9=80=80=E8=B4=A7=E5=8D=95?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E7=9B=B8=E5=90=8C=E9=9D=9E=E4=B8=B2=E7=A0=81?= =?UTF-8?q?=E5=95=86=E5=93=81=E9=80=80=E8=B4=A7=E9=87=91=E9=A2=9D=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=203=E3=80=81=E4=BA=A7=E5=93=81=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=B1=87=E6=80=BB=EF=BC=88=E6=8C=89=E9=97=A8=E5=BA=97=EF=BC=89?= =?UTF-8?q?=E6=80=BB=E9=87=91=E9=A2=9D=E5=9B=9B=E8=88=8D=E4=BA=94=E5=85=A5?= =?UTF-8?q?;=204=E3=80=81=E9=97=A8=E5=BA=97=E7=BB=8F=E8=90=A5=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=B1=87=E6=80=BB=E6=95=B0=E6=8D=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/erpordermanage/erp_order.go | 1 + app/admin/models/erp_order.go | 84 ++++++++++++++++++---- app/admin/models/inventory_report.go | 1 + docs/docs.go | 20 ++++++ docs/swagger.json | 20 ++++++ docs/swagger.yaml | 15 ++++ 6 files changed, 129 insertions(+), 12 deletions(-) diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index fa30c98..28c8aea 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -207,6 +207,7 @@ func ErpOrderAudit(c *gin.Context) { } var checkReq model.ErpOrderCreateReq + checkReq.StoreId = erpOrder.StoreId checkReq.ErpOrderCommodities = commodity err = model.CheckOrderCommodityStock(&checkReq) if err != nil { diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index 31462eb..ed120f4 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -262,11 +262,16 @@ type ErpOrderStoreManageDataReq struct { // ErpOrderStoreManageDataResp 查询门店经营出参 type ErpOrderStoreManageDataResp struct { - List []StoreManageData `json:"list"` - Total int `json:"total"` // 总条数 - PageIndex int `json:"pageIndex"` // 页码 - PageSize int `json:"pageSize"` // 每页展示条数 - ExportUrl string `json:"export_url"` + List []StoreManageData `json:"list"` + Total int `json:"total"` // 总条数 + PageIndex int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 每页展示条数 + ExportUrl string `json:"export_url"` + TotalSalesAmount float64 `json:"total_sales_amount"` // 总销售额 + TotalPromotionFee float64 `json:"total_promotion_fee"` // 总推广费 + TotalSalesProfit float64 `json:"total_sales_profit"` // 总销售毛利 + TotalStaffProfit float64 `json:"total_staff_profit"` // 总员工毛利 + TotalCount int64 `json:"total_count"` // 总销售数量 } // StoreManageData 门店经营数据 @@ -1483,6 +1488,8 @@ func mergeOrderCommodities(orderCommodities []ErpOrderCommodity) []ErpOrderCommo existingCommodity.SaleDiscount += commodity.SaleDiscount existingCommodity.MemberDiscount += commodity.MemberDiscount existingCommodity.ReceivedAmount += commodity.ReceivedAmount + existingCommodity.RejectedCount += commodity.RejectedCount + existingCommodity.RejectedAmount += commodity.RejectedAmount stockCommodityID, _ := tools.StringToInt(commodity.ErpStockCommodityID) if stockCommodityID > 0 { existingCommodity.ErpStockCommodityID = strings.Join([]string{existingCommodity.ErpStockCommodityID, commodity.ErpStockCommodityID}, ",") @@ -2372,7 +2379,26 @@ func QueryStoreManageData(req *ErpOrderStoreManageDataReq, c *gin.Context) (*Erp } qs.Where("state = ?", ErpOrderStateAudited) - // 查询数据 + // 查询汇总数据 + var summary struct { + TotalSalesAmount float64 + TotalPromotionFee float64 + TotalSalesProfit float64 + TotalStaffProfit float64 + TotalCount int64 + } + err = qs.Select("SUM(CASE WHEN retail_type = 'sale' THEN total_amount ELSE -total_amount END) AS total_sales_amount, " + + "SUM(CASE WHEN retail_type = 'sale' THEN total_discount ELSE -total_discount END) AS total_promotion_fee, " + + "SUM(CASE WHEN retail_type = 'sale' THEN total_sales_profit ELSE -total_sales_profit END) AS total_sales_profit, " + + "SUM(CASE WHEN retail_type = 'sale' THEN total_staff_profit ELSE -total_staff_profit END) AS total_staff_profit, " + + "SUM(CASE WHEN retail_type = 'sale' THEN total_count ELSE -total_count END) AS total_count"). + Find(&summary).Error + if err != nil { + logger.Error("QueryStoreManageData summary err:", logger.Field("err", err)) + return nil, err + } + + // 查询分页数据 if req.SortType == "asc" { err = qs.Select("DATE_FORMAT(maker_time, '%Y-%m-%d') AS date, " + "SUM(CASE WHEN retail_type = 'sale' THEN total_discount ELSE -total_discount END) AS promotion_fee, " + @@ -2401,6 +2427,13 @@ func QueryStoreManageData(req *ErpOrderStoreManageDataReq, c *gin.Context) (*Erp finalStoreManageDataList := constructFinalStoreManageDataList(storeManageDataList, req) + // 汇总数据赋值给响应 + resp.TotalSalesAmount = math.Round(summary.TotalSalesAmount*100) / 100 + resp.TotalPromotionFee = math.Round(summary.TotalPromotionFee*100) / 100 + resp.TotalSalesProfit = math.Round(summary.TotalSalesProfit*100) / 100 + resp.TotalStaffProfit = math.Round(summary.TotalStaffProfit*100) / 100 + resp.TotalCount = summary.TotalCount + if req.IsExport == 1 { //导出excel storeName := "所有门店" if req.StoreId != 0 { @@ -2413,7 +2446,7 @@ func QueryStoreManageData(req *ErpOrderStoreManageDataReq, c *gin.Context) (*Erp } finalStoreManageDataList = constructFinalStoreManageDataList(storeManageDataList, req) - filePath, err := storeManageDataExport(finalStoreManageDataList, storeName, c) + filePath, err := storeManageDataExport(finalStoreManageDataList, storeName, summary, c) if err != nil { logger.Error("StoreManageDataExport err:", logger.Field("err", err)) return nil, err @@ -2492,7 +2525,13 @@ func constructFinalStoreManageDataList(storeManageDataList []StoreManageData, re } // StoreManageDataExport 导出门店经营数据 -func storeManageDataExport(list []StoreManageData, storeName string, c *gin.Context) (string, error) { +func storeManageDataExport(list []StoreManageData, storeName string, summary struct { + TotalSalesAmount float64 + TotalPromotionFee float64 + TotalSalesProfit float64 + TotalStaffProfit float64 + TotalCount int64 +}, c *gin.Context) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" @@ -2556,6 +2595,25 @@ func storeManageDataExport(list []StoreManageData, storeName string, c *gin.Cont nExcelStartRow++ } + totalData := "汇总 记录数:" + strconv.FormatInt(int64(len(list)), 10) + end := []interface{}{totalData, summary.TotalSalesAmount, summary.TotalPromotionFee} + + if flag1 { // 销售毛利 + end = append(end, summary.TotalSalesProfit) + } + if flag2 { // 员工毛利 + end = append(end, summary.TotalStaffProfit) + } + end = append(end, summary.TotalCount) + + for i, _ := range end { + cell, _ := excelize.CoordinatesToCellName(1+i, nExcelStartRow+2) + err := file.SetCellValue(fSheet, cell, end[i]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + // 设置所有单元格的样式: 居中、加边框 style, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}, "border":[{"type":"left","color":"000000","style":1}, @@ -2572,11 +2630,11 @@ func storeManageDataExport(list []StoreManageData, storeName string, c *gin.Cont var endRow string switch nEndCount { case 1: - endRow = fmt.Sprintf("E"+"%d", nExcelStartRow+1) + endRow = fmt.Sprintf("E"+"%d", nExcelStartRow+2) case 2: - endRow = fmt.Sprintf("F"+"%d", nExcelStartRow+1) + endRow = fmt.Sprintf("F"+"%d", nExcelStartRow+2) default: - endRow = fmt.Sprintf("D"+"%d", nExcelStartRow+1) + endRow = fmt.Sprintf("D"+"%d", nExcelStartRow+2) } // 应用样式到整个表格 _ = file.SetCellStyle("Sheet1", "A1", endRow, style) @@ -5457,10 +5515,12 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) { //// 单个商品退货金额 //req.ErpOrderCommodities[i].RejectedAmount = req.ErpOrderCommodities[i].RejectedAmount / float64(req.ErpOrderCommodities[i].Count) - for j := 0; j < int(req.ErpOrderCommodities[i].Count); j++ { + for j := 0; j < int(req.ErpOrderCommodities[i].RejectedCount); j++ { stockIdList, _ := stringToIntArray(req.ErpOrderCommodities[i].ErpStockCommodityID) temp := req.ErpOrderCommodities[i] + temp.RejectedAmount = req.ErpOrderCommodities[i].RejectedAmount / float64(req.ErpOrderCommodities[i].RejectedCount) temp.Count = 1 + temp.RejectedCount = 1 if len(stockIdList) > j { temp.ErpStockCommodityID = fmt.Sprintf("%d", stockIdList[j]) } diff --git a/app/admin/models/inventory_report.go b/app/admin/models/inventory_report.go index 69732ec..92f980c 100644 --- a/app/admin/models/inventory_report.go +++ b/app/admin/models/inventory_report.go @@ -388,6 +388,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve resp.TotalEffectiveAmount = sumData.TotalEffectiveAmount resp.TotalTransferAmount = sumData.TotalTransferAmount resp.TotalAmount = resp.TotalEffectiveAmount + resp.TotalTransferAmount + resp.TotalAmount = math.Round(resp.TotalAmount*100) / 100 resp.Total = uint32(len(reportList)) resp.List = reportList diff --git a/docs/docs.go b/docs/docs.go index 354119d..51bb203 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -9997,6 +9997,26 @@ const docTemplate = `{ "total": { "description": "总条数", "type": "integer" + }, + "total_count": { + "description": "总销售数量", + "type": "integer" + }, + "total_promotion_fee": { + "description": "总推广费", + "type": "number" + }, + "total_sales_amount": { + "description": "总销售额", + "type": "number" + }, + "total_sales_profit": { + "description": "总销售毛利", + "type": "number" + }, + "total_staff_profit": { + "description": "总员工毛利", + "type": "number" } } }, diff --git a/docs/swagger.json b/docs/swagger.json index d7ad80a..bfbfbcc 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -9986,6 +9986,26 @@ "total": { "description": "总条数", "type": "integer" + }, + "total_count": { + "description": "总销售数量", + "type": "integer" + }, + "total_promotion_fee": { + "description": "总推广费", + "type": "number" + }, + "total_sales_amount": { + "description": "总销售额", + "type": "number" + }, + "total_sales_profit": { + "description": "总销售毛利", + "type": "number" + }, + "total_staff_profit": { + "description": "总员工毛利", + "type": "number" } } }, diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 161c726..e9f343a 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2708,6 +2708,21 @@ definitions: total: description: 总条数 type: integer + total_count: + description: 总销售数量 + type: integer + total_promotion_fee: + description: 总推广费 + type: number + total_sales_amount: + description: 总销售额 + type: number + total_sales_profit: + description: 总销售毛利 + type: number + total_staff_profit: + description: 总员工毛利 + type: number type: object models.ErpPurchaseAuditReq: properties: