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