From c6c500d7044c5e4785fc856a5a1253b0604a8147 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期二, 04 六月 2024 21:16:18 +0800 Subject: [PATCH] 库存报表下载 --- controllers/report_forms_controller.go | 175 +++++++++++++++++---------------------------------------- 1 files changed, 53 insertions(+), 122 deletions(-) diff --git a/controllers/report_forms_controller.go b/controllers/report_forms_controller.go index 7c48974..03cc2b0 100644 --- a/controllers/report_forms_controller.go +++ b/controllers/report_forms_controller.go @@ -4,10 +4,13 @@ "fmt" "github.com/gin-gonic/gin" "github.com/shopspring/decimal" + "net/url" + "os" "wms/constvar" "wms/extend/code" "wms/extend/util" "wms/models" + "wms/pkg/logx" "wms/request" "wms/response" "wms/service" @@ -28,6 +31,7 @@ // @Tags 鎶ヨ〃 // @Summary 鑾峰彇搴撳瓨鎶ヨ〃 // @Produce application/json +// @Param Authorization header string true "token" // @Param object body request.GetInventoryForms true "鏌ヨ鍙傛暟" // @Success 200 {object} util.ResponseList{data=[]response.InventoryForms} "鎴愬姛" // @Router /api-wms/v1/forms/getInventoryForms [post] @@ -38,137 +42,64 @@ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") return } - locationIds := make([]int, 0) - productIds := make([]string, 0) - productAmounts := make([]*models.LocationProductAmount, 0) - if params.WarehouseCode != "" { - locations, err := models.NewLocationSearch().SetJointName(params.WarehouseCode).FindNotTotal() - if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ浠撳簱浣嶇疆澶辫触") - return - } - - for _, location := range locations { - locationIds = append(locationIds, location.Id) - } - productAmounts, err = models.NewLocationProductAmountSearch().SetLocationIds(locationIds).SetQuery("amount > 0").Find() - if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍦ㄥ簱鏁伴噺澶辫触") - return - } - for _, amount := range productAmounts { - productIds = append(productIds, amount.ProductId) - } - - } - //鏌ヨ浜у搧 - search := models.NewMaterialSearch() - search.Orm = search.Orm.Model(&models.Material{}). - Select(`material.id, material.name, material.cost, material.amount, material.unit, wms_product_category.name as category_name `). - Joins("left join wms_product_category on material.category_id = wms_product_category.id") - if len(params.CategoryIds) > 0 { - search.Orm.Where("material.category_id in (?)", params.CategoryIds) - } - if params.KeyWord != "" { - search.Orm.Where("material.name like ?", "%"+params.KeyWord+"%").Or("wms_product_category.name like ?", "%"+params.KeyWord+"%") - } - if len(productIds) > 0 { - search.Orm.Where("material.id in (?)", productIds) - } - var ( - materials = make([]*models.Material, 0) - total int64 - ) - if err := search.Orm.Count(&total).Error; err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨtotal澶辫触") - return - } - if params.Page*params.PageSize > 0 { - search.Orm = search.Orm.Offset((params.Page - 1) * params.PageSize).Limit(params.PageSize) - } - if err := search.Orm.Find(&materials).Error; err != nil { - util.ResponseFormat(c, code.RequestParamError, fmt.Errorf("鏌ヨ浜у搧澶辫触: %v", err)) - return - } - - //鏌ヨ鍦ㄥ簱鏁伴噺 - if len(productIds) == 0 { - for _, material := range materials { - productIds = append(productIds, material.ID) - } - productAmounts, err = models.NewLocationProductAmountSearch().SetProductIds(productIds).SetLocationIds(locationIds).Find() - if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍦ㄥ簱鏁伴噺澶辫触") - return - } - } - - //鏌ヨ鍑哄叆搴撳氨缁暟閲� - var inHouse []Detail - var outHouse []Detail - dbIn := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}). - Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status"). - Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id"). - Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}). - Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Finish}) - dbOut := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}). - Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status"). - Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id"). - Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal, constvar.BaseOperationTypeDisuse}). - Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Ready, constvar.OperationStatus_Finish}) - if len(locationIds) > 0 { - dbIn.Where("wms_operation_details.to_location_id in (?)", locationIds) - dbOut.Where("wms_operation_details.from_location_id in (?)", locationIds) - } - if len(productIds) > 0 { - dbIn.Where("wms_operation_details.product_id in (?)", productIds) - dbOut.Where("wms_operation_details.product_id in (?)", productIds) - } - err = dbIn.Find(&inHouse).Error + inventoryReportFormsService := service.NewInventoryReportFormsService() + total, err := inventoryReportFormsService.Count(params) if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍏ュ簱鏁伴噺澶辫触") + logx.Errorf("GetInventoryForms count err:%v", err) + util.ResponseFormat(c, code.InternalError, "鏌ヨ鎬绘暟澶辫触") return } - err = dbOut.Find(&outHouse).Error + result, err := inventoryReportFormsService.Query(params) if err != nil { - util.ResponseFormat(c, code.RequestParamError, "鏌ヨ鍑哄簱鏁伴噺澶辫触") + logx.Errorf("GetInventoryForms query err:%v", err) + util.ResponseFormat(c, code.InternalError, "鏌ヨ澶辫触") return } - var result []response.InventoryForms - for _, material := range materials { - var resp response.InventoryForms - resp.ProduceId = material.ID - resp.ProductName = material.Name - resp.Cost = material.Cost - resp.Unit = material.Unit - resp.Value = material.Amount.Mul(material.Cost) - resp.ProductType = material.CategoryName - for _, amount := range productAmounts { - if material.ID == amount.ProductId { - resp.Amount = resp.Amount.Add(amount.Amount) - } - } - for _, details := range inHouse { - if material.ID == details.ProductId { - resp.In = resp.In.Add(details.Amount) - } - } - available := decimal.NewFromInt(0) - for _, details := range outHouse { - if material.ID == details.ProductId { - if details.Status == constvar.OperationStatus_Ready { - available = available.Add(details.Amount) - } else { - resp.Out = resp.Out.Add(details.Amount) - } - } - } - resp.AvailableNumber = resp.Amount.Sub(available) - result = append(result, resp) - } + util.ResponseFormatList(c, code.Success, result, int(total)) } +// DownloadInventoryForms +// @Tags 鎶ヨ〃 +// @Summary 涓嬭浇搴撳瓨鎶ヨ〃 +// @Produce application/json +// @Param Authorization header string true "token" +// @Param object body request.GetInventoryForms true "鏌ヨ鍙傛暟" +// @Success 200 {object} util.ResponseList{data=[]response.InventoryForms} "鎴愬姛" +// @Router /api-wms/v1/forms/downloadInventoryForms [post] +func (slf ReportFormsController) DownloadInventoryForms(c *gin.Context) { + var params request.GetInventoryForms + err := c.BindJSON(¶ms) + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "鍙傛暟瑙f瀽澶辫触锛屾暟鎹被鍨嬮敊璇�") + return + } + inventoryReportFormsService := service.NewInventoryReportFormsService() + list, err := inventoryReportFormsService.FetchAll(params) + if err != nil { + logx.Errorf("DownloadInventoryForms FetchAll err:%v", err) + util.ResponseFormat(c, code.InternalError, "鏌ヨ澶辫触") + return + } + filename, err := inventoryReportFormsService.Export(list) + if err != nil { + logx.Errorf("DownloadInventoryForms Export err:%v", err) + util.ResponseFormat(c, code.InternalError, "瀵煎嚭鏁版嵁鍒版枃浠跺け璐�") + return + } + + if err != nil { + util.ResponseFormat(c, code.RequestParamError, "瀵煎嚭澶辫触") + return + } + + fileContentDisposition := "attachment;filename=\"" + url.QueryEscape(filename) + "\"" + c.Header("Content-Type", "application/xlsx") + c.Header("Content-Disposition", fileContentDisposition) + c.File(filename) + defer os.Remove(filename) +} + // GetHistory // @Tags 鎶ヨ〃 // @Summary 鑾峰彇鍘嗗彶淇℃伅 -- Gitblit v1.8.0