From ee8c1c18382dce5394677b1066385d7ef276c2f1 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期三, 12 六月 2024 22:59:16 +0800 Subject: [PATCH] 库存报表查询及报表下载支持多单位 --- service/inventory_report_forms.go | 93 +++++++++++++++++++---- response/report_forms_response.go | 25 +++-- service/history_forms.go | 2 models/material.go | 2 service/month_forms.go | 1 service/more_units.go | 35 ++++++++ docs/swagger.yaml | 21 +++++ docs/docs.go | 29 +++++++ docs/swagger.json | 29 +++++++ 9 files changed, 208 insertions(+), 29 deletions(-) diff --git a/docs/docs.go b/docs/docs.go index ebff3df..7837c42 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -4491,6 +4491,7 @@ "type": "number" }, "floating": { + "description": "鏄惁娴姩鍒╃巼", "type": "boolean" }, "unit": { @@ -5674,9 +5675,23 @@ "description": "鍦ㄥ簱鏁伴噺", "type": "number" }, + "amountMoreUnits": { + "description": "鍦ㄥ簱鏁伴噺澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } + }, "availableNumber": { "description": "鍙敤搴撳瓨", "type": "number" + }, + "availableNumberMoreUnits": { + "description": "鍙敤搴撳瓨澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } }, "cost": { "description": "鎴愭湰", @@ -5686,10 +5701,24 @@ "description": "鍏ュ簱", "type": "number" }, + "inMoreUnits": { + "description": "鍏ュ簱澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } + }, "out": { "description": "鍑哄簱", "type": "number" }, + "outMoreUnits": { + "description": "鍑哄簱澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } + }, "produceId": { "description": "浜у搧id", "type": "string" diff --git a/docs/swagger.json b/docs/swagger.json index 55a6798..36ca1e2 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -4479,6 +4479,7 @@ "type": "number" }, "floating": { + "description": "鏄惁娴姩鍒╃巼", "type": "boolean" }, "unit": { @@ -5662,9 +5663,23 @@ "description": "鍦ㄥ簱鏁伴噺", "type": "number" }, + "amountMoreUnits": { + "description": "鍦ㄥ簱鏁伴噺澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } + }, "availableNumber": { "description": "鍙敤搴撳瓨", "type": "number" + }, + "availableNumberMoreUnits": { + "description": "鍙敤搴撳瓨澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } }, "cost": { "description": "鎴愭湰", @@ -5674,10 +5689,24 @@ "description": "鍏ュ簱", "type": "number" }, + "inMoreUnits": { + "description": "鍏ュ簱澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } + }, "out": { "description": "鍑哄簱", "type": "number" }, + "outMoreUnits": { + "description": "鍑哄簱澶氬崟浣�", + "type": "array", + "items": { + "$ref": "#/definitions/models.UnitItems" + } + }, "produceId": { "description": "浜у搧id", "type": "string" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index d8fb65a..ebfef94 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1037,6 +1037,7 @@ amount: type: number floating: + description: 鏄惁娴姩鍒╃巼 type: boolean unit: type: string @@ -1858,18 +1859,38 @@ amount: description: 鍦ㄥ簱鏁伴噺 type: number + amountMoreUnits: + description: 鍦ㄥ簱鏁伴噺澶氬崟浣� + items: + $ref: '#/definitions/models.UnitItems' + type: array availableNumber: description: 鍙敤搴撳瓨 type: number + availableNumberMoreUnits: + description: 鍙敤搴撳瓨澶氬崟浣� + items: + $ref: '#/definitions/models.UnitItems' + type: array cost: description: 鎴愭湰 type: number in: description: 鍏ュ簱 type: number + inMoreUnits: + description: 鍏ュ簱澶氬崟浣� + items: + $ref: '#/definitions/models.UnitItems' + type: array out: description: 鍑哄簱 type: number + outMoreUnits: + description: 鍑哄簱澶氬崟浣� + items: + $ref: '#/definitions/models.UnitItems' + type: array produceId: description: 浜у搧id type: string diff --git a/models/material.go b/models/material.go index fe9e42a..4c6eaa2 100644 --- a/models/material.go +++ b/models/material.go @@ -120,7 +120,7 @@ UnitItems struct { Amount decimal.Decimal `json:"amount"` Unit string `json:"unit"` - Floating bool `json:"floating"` + Floating bool `json:"floating"` //鏄惁娴姩鍒╃巼 } ) diff --git a/response/report_forms_response.go b/response/report_forms_response.go index 5d4f159..aee3590 100644 --- a/response/report_forms_response.go +++ b/response/report_forms_response.go @@ -4,19 +4,24 @@ "github.com/shopspring/decimal" "time" "wms/constvar" + "wms/models" ) type InventoryForms struct { - ProduceId string `json:"produceId"` //浜у搧id - ProductName string `json:"productName"` //浜у搧鍚嶇О - ProductType string `json:"productType"` //浜у搧绫诲瀷 - Cost decimal.Decimal `json:"cost"` //鎴愭湰 - Value decimal.Decimal `json:"value"` //鎬讳环鍊� - Amount decimal.Decimal `json:"amount"` //鍦ㄥ簱鏁伴噺 - AvailableNumber decimal.Decimal `json:"availableNumber"` //鍙敤搴撳瓨 - In decimal.Decimal `json:"in"` //鍏ュ簱 - Out decimal.Decimal `json:"out"` //鍑哄簱 - Unit string `json:"unit"` //鍗曚綅 + ProduceId string `json:"produceId"` //浜у搧id + ProductName string `json:"productName"` //浜у搧鍚嶇О + ProductType string `json:"productType"` //浜у搧绫诲瀷 + Cost decimal.Decimal `json:"cost"` //鎴愭湰 + Value decimal.Decimal `json:"value"` //鎬讳环鍊� + Amount decimal.Decimal `json:"amount"` //鍦ㄥ簱鏁伴噺 + AmountMoreUnits []models.UnitItems `json:"amountMoreUnits"` //鍦ㄥ簱鏁伴噺澶氬崟浣� + AvailableNumber decimal.Decimal `json:"availableNumber"` //鍙敤搴撳瓨 + AvailableNumberMoreUnits []models.UnitItems `json:"availableNumberMoreUnits"` //鍙敤搴撳瓨澶氬崟浣� + In decimal.Decimal `json:"in"` //鍏ュ簱 + InMoreUnits []models.UnitItems `json:"inMoreUnits"` //鍏ュ簱澶氬崟浣� + Out decimal.Decimal `json:"out"` //鍑哄簱 + OutMoreUnits []models.UnitItems `json:"outMoreUnits"` //鍑哄簱澶氬崟浣� + Unit string `json:"unit"` //鍗曚綅 } type InventoryHistory struct { diff --git a/service/history_forms.go b/service/history_forms.go index dad0ce4..14e212e 100644 --- a/service/history_forms.go +++ b/service/history_forms.go @@ -100,7 +100,7 @@ // 璁剧疆琛ㄥご for i, header := range headers { - cell := getColumnAlphabet(i+1) + "1" + cell := getColumnAlphabet(i) + "1" f.SetCellValue("Sheet1", cell, header) } diff --git a/service/inventory_report_forms.go b/service/inventory_report_forms.go index e83af14..9d5f88d 100644 --- a/service/inventory_report_forms.go +++ b/service/inventory_report_forms.go @@ -109,6 +109,14 @@ } } data.AvailableNumber = data.Amount.Sub(available) + + if *material.MoreUnit { + data.AmountMoreUnits = CreateMoreUnit(data.Amount, material.MoreUnitList) + data.AvailableNumberMoreUnits = CreateMoreUnit(data.AvailableNumber, material.MoreUnitList) + data.InMoreUnits = CreateMoreUnit(data.In, material.MoreUnitList) + data.OutMoreUnits = CreateMoreUnit(data.Out, material.MoreUnitList) + } + result = append(result, data) } return @@ -142,7 +150,7 @@ //鏌ヨ浜у搧 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 `). + Select(`material.id, material.name, material.cost, material.amount, material.unit, material.more_unit, material.more_unit_value, 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) @@ -196,25 +204,78 @@ f := excelize.NewFile() // 鑷畾涔夎〃澶� - headers := []string{"浜у搧", "浜у搧绫诲埆", "鍗曚綅鎴愭湰", "鎬讳环鍊�", "鍦ㄥ簱", "鍙敤搴撳瓨", "鍏ュ簱", "鍑哄簱", "鍗曚綅"} - + headers := []string{"浜у搧", "浜у搧绫诲埆", "鍗曚綅鎴愭湰", "鎬讳环鍊�", "鍦ㄥ簱", "鍙敤搴撳瓨", "鍏ュ簱", "鍑哄簱"} // 璁剧疆琛ㄥご for i, header := range headers { - cell := getColumnAlphabet(i+1) + "1" + cell := getColumnAlphabet(i) + "1" f.SetCellValue("Sheet1", cell, header) } + f.SetCellValue("Sheet1", getColumnAlphabet(0)+"1", "浜у搧") + f.SetCellValue("Sheet1", getColumnAlphabet(1)+"1", "浜у搧绫诲埆") + f.SetCellValue("Sheet1", getColumnAlphabet(2)+"1", "鍗曚綅鎴愭湰") + f.SetCellValue("Sheet1", getColumnAlphabet(3)+"1", "鎬讳环鍊�") + f.SetCellValue("Sheet1", getColumnAlphabet(4)+"1", "鍦ㄥ簱") + f.MergeCell("Sheet1", getColumnAlphabet(4)+"1", getColumnAlphabet(7)+"1") // 鍚堝苟鍗曞厓鏍� + f.SetCellValue("Sheet1", getColumnAlphabet(8)+"1", "鍙敤搴撳瓨") + f.MergeCell("Sheet1", getColumnAlphabet(8)+"1", getColumnAlphabet(11)+"1") // 鍚堝苟鍗曞厓鏍� + f.SetCellValue("Sheet1", getColumnAlphabet(12)+"1", "鍏ュ簱") + f.MergeCell("Sheet1", getColumnAlphabet(12)+"1", getColumnAlphabet(15)+"1") // 鍚堝苟鍗曞厓鏍� + f.SetCellValue("Sheet1", getColumnAlphabet(16)+"1", "鍑哄簱") + f.MergeCell("Sheet1", getColumnAlphabet(16)+"1", getColumnAlphabet(19)+"1") // 鍚堝苟鍗曞厓鏍� + + unitData := []string{"浠�", "鍖�", "绫�", "閲嶉噺"} + for i, header := range unitData { + f.SetCellValue("Sheet1", getColumnAlphabet(i+4)+"2", header) + f.SetCellValue("Sheet1", getColumnAlphabet(i+8)+"2", header) + f.SetCellValue("Sheet1", getColumnAlphabet(i+12)+"2", header) + f.SetCellValue("Sheet1", getColumnAlphabet(i+16)+"2", header) + } + + // 璁剧疆琛ㄥご鏍峰紡 + style := &excelize.Style{ + Border: nil, + Fill: excelize.Fill{ + Type: "pattern", + Pattern: 1, + Shading: 0, + }, + Font: &excelize.Font{ + Bold: true, + }, + Alignment: &excelize.Alignment{ + Horizontal: "center", + }, + } + titleStyle, err := f.NewStyle(style) + if err != nil { + return + } + + lastColumn := getColumnAlphabet(19) + f.SetCellStyle("Sheet1", "A1", lastColumn+"2", titleStyle) + // 璁剧疆鍒楀 + f.SetColWidth("Sheet1", "A", "D", 30) + f.SetColWidth("Sheet1", "E", lastColumn, 15) + for i, v := range dataList { - column := strconv.Itoa(i + 2) - f.SetCellValue("Sheet1", "A"+column, v.ProductName) - f.SetCellValue("Sheet1", "B"+column, v.ProductType) - f.SetCellValue("Sheet1", "C"+column, v.Cost) - f.SetCellValue("Sheet1", "D"+column, v.Value) - f.SetCellValue("Sheet1", "E"+column, v.Amount) - f.SetCellValue("Sheet1", "F"+column, v.AvailableNumber) - f.SetCellValue("Sheet1", "G"+column, v.In) - f.SetCellValue("Sheet1", "H"+column, v.Out) - f.SetCellValue("Sheet1", "I"+column, v.Unit) + column := strconv.Itoa(i + 3) + f.SetCellValue("Sheet1", getColumnAlphabet(0)+column, v.ProductName) + f.SetCellValue("Sheet1", getColumnAlphabet(1)+column, v.ProductType) + f.SetCellValue("Sheet1", getColumnAlphabet(2)+column, v.Cost) + f.SetCellValue("Sheet1", getColumnAlphabet(3)+column, v.Value) + + f.SetCellValue("Sheet1", getColumnAlphabet(4)+column, v.Amount) + FillMoreUnitToExcel(v.Amount, v.AmountMoreUnits, 5, i+3, f) + + f.SetCellValue("Sheet1", getColumnAlphabet(8)+column, v.AvailableNumber) + FillMoreUnitToExcel(v.AvailableNumber, v.AvailableNumberMoreUnits, 9, i+3, f) + + f.SetCellValue("Sheet1", getColumnAlphabet(12)+column, v.In) + FillMoreUnitToExcel(v.In, v.AmountMoreUnits, 13, i+3, f) + + f.SetCellValue("Sheet1", getColumnAlphabet(16)+column, v.Out) + FillMoreUnitToExcel(v.Out, v.AmountMoreUnits, 17, i+3, f) } fileName = fmt.Sprintf("搴撳瓨鎶ヨ〃%s.xlsx", time.Now().Format("2006-01-02-1504")) @@ -229,7 +290,7 @@ func getColumnAlphabet(index int) string { const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" if index <= 26 { - return string(alphabet[index-1]) + return string(alphabet[index]) } - return getColumnAlphabet((index-1)/26) + getColumnAlphabet((index-1)%26+1) + return getColumnAlphabet((index)/26) + getColumnAlphabet((index)%26+1) } diff --git a/service/month_forms.go b/service/month_forms.go index 2073e9d..4bde4dc 100644 --- a/service/month_forms.go +++ b/service/month_forms.go @@ -111,7 +111,6 @@ } titleStyle, err := f.NewStyle(style) if err != nil { - fmt.Println(err) return } f.SetCellStyle("Sheet1", "A1", "R2", titleStyle) diff --git a/service/more_units.go b/service/more_units.go new file mode 100644 index 0000000..8671ce3 --- /dev/null +++ b/service/more_units.go @@ -0,0 +1,35 @@ +package service + +import ( + "github.com/shopspring/decimal" + "github.com/xuri/excelize/v2" + "strconv" + "wms/models" +) + +func CreateMoreUnit(amount decimal.Decimal, units []models.UnitItems) []models.UnitItems { + moreValueArr := make([]models.UnitItems, 0, len(units)) + for _, unitItem := range units { + moreValueArr = append(moreValueArr, models.UnitItems{ + Amount: amount.Mul(unitItem.Amount), + Unit: unitItem.Unit, + Floating: unitItem.Floating, + }) + } + return moreValueArr +} + +func FillMoreUnitToExcel(amount decimal.Decimal, units []models.UnitItems, startIndex int, column int, f *excelize.File) { + columnStr := strconv.Itoa(column) + for _, v := range units { + switch v.Unit { + case "鍖�": + f.SetCellValue("Sheet1", getColumnAlphabet(startIndex)+columnStr, v.Amount.Mul(amount)) + case "绫�": + f.SetCellValue("Sheet1", getColumnAlphabet(startIndex+1)+columnStr, v.Amount.Mul(amount)) + case "閲嶉噺": + f.SetCellValue("Sheet1", getColumnAlphabet(startIndex+2)+columnStr, v.Amount.Mul(amount)) + } + } + return +} -- Gitblit v1.8.0