From 34de248a46755b2309f5ac8e95261c25fe1e210d Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期二, 30 七月 2024 19:12:47 +0800
Subject: [PATCH] 月度报表多单位使用动态表头及相应调整

---
 service/more_units.go |  116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 115 insertions(+), 1 deletions(-)

diff --git a/service/more_units.go b/service/more_units.go
index 8671ce3..7343b9b 100644
--- a/service/more_units.go
+++ b/service/more_units.go
@@ -1,6 +1,7 @@
 package service
 
 import (
+	"errors"
 	"github.com/shopspring/decimal"
 	"github.com/xuri/excelize/v2"
 	"strconv"
@@ -10,11 +11,58 @@
 func CreateMoreUnit(amount decimal.Decimal, units []models.UnitItems) []models.UnitItems {
 	moreValueArr := make([]models.UnitItems, 0, len(units))
 	for _, unitItem := range units {
+		if unitItem.Amount.IsZero() {
+			continue
+		}
 		moreValueArr = append(moreValueArr, models.UnitItems{
-			Amount:   amount.Mul(unitItem.Amount),
+			Amount:   amount.Div(unitItem.Amount),
 			Unit:     unitItem.Unit,
 			Floating: unitItem.Floating,
 		})
+	}
+	return moreValueArr
+}
+
+func AddMoreUnit(units []models.UnitItems, units2 []models.UnitItems) []models.UnitItems {
+	moreValueArr := make([]models.UnitItems, 0, len(units))
+	for _, unitItem1 := range units {
+		for _, unitItem2 := range units2 {
+			if unitItem1.Unit == unitItem2.Unit {
+				moreValueArr = append(moreValueArr, models.UnitItems{
+					Amount:   unitItem1.Amount.Add(unitItem2.Amount),
+					Unit:     unitItem1.Unit,
+					Floating: unitItem1.Floating,
+				})
+			}
+		}
+	}
+	return moreValueArr
+}
+
+// MoreUnitIsEnough 澶氬崟浣嶅簱瀛樻槸鍚﹁冻澶�
+func MoreUnitIsEnough(units []models.UnitItems, units2 []models.UnitItems) bool {
+	for _, unitItem1 := range units {
+		for _, unitItem2 := range units2 {
+			if unitItem1.Amount.LessThan(unitItem2.Amount) {
+				return false
+			}
+		}
+	}
+	return true
+}
+
+func SubMoreUnit(units []models.UnitItems, units2 []models.UnitItems) []models.UnitItems {
+	moreValueArr := make([]models.UnitItems, 0, len(units))
+	for _, unitItem1 := range units {
+		for _, unitItem2 := range units2 {
+			if unitItem1.Unit == unitItem2.Unit {
+				moreValueArr = append(moreValueArr, models.UnitItems{
+					Amount:   unitItem1.Amount.Sub(unitItem2.Amount),
+					Unit:     unitItem1.Unit,
+					Floating: unitItem1.Floating,
+				})
+			}
+		}
 	}
 	return moreValueArr
 }
@@ -33,3 +81,69 @@
 	}
 	return
 }
+
+func SetExcelHeader(headers []interface{}, f *excelize.File) (err error) {
+	// 璁剧疆琛ㄥご
+	var i int
+	for _, h := range headers {
+		if v, ok := h.(string); ok {
+			err = f.SetCellValue("Sheet1", getColumnAlphabet(i)+"1", v)
+			if err != nil {
+				return
+			}
+			i++
+		} else if childHeaders, ok := h.(map[string][]string); ok {
+			for title, list := range childHeaders {
+				err = f.SetCellValue("Sheet1", getColumnAlphabet(i)+"1", title)
+				if err != nil {
+					return err
+				}
+				err = f.MergeCell("Sheet1", getColumnAlphabet(i)+"1", getColumnAlphabet(i-1+len(list))+"1") // 鍚堝苟鍗曞厓鏍�
+				for _, t := range list {
+					err = f.SetCellValue("Sheet1", getColumnAlphabet(i)+"2", t)
+					if err != nil {
+						return err
+					}
+					i++
+				}
+			}
+		} else {
+			return errors.New("unsupported header value")
+		}
+	}
+	return nil
+}
+
+func SetHeaderStyle(f *excelize.File) (styleInt int, err error) {
+	// 璁剧疆琛ㄥご鏍峰紡
+	style := &excelize.Style{
+		Border: nil,
+		Fill: excelize.Fill{
+			Type:    "pattern",
+			Pattern: 1,
+			Shading: 0,
+		},
+		Font: &excelize.Font{
+			Bold: true,
+		},
+		Alignment: &excelize.Alignment{
+			Horizontal: "center",
+		},
+	}
+	return f.NewStyle(style)
+}
+
+func GetAllUnits() (allUnits []string, unitIndexMap map[string]int) {
+	units, err := models.NewUnitDictSearch().FindNotTotal()
+	allUnits = make([]string, 0, len(units))
+	unitIndexMap = make(map[string]int)
+	if err != nil {
+		return
+	}
+
+	for k, v := range units {
+		allUnits = append(allUnits, v.Name)
+		unitIndexMap[v.Name] = k
+	}
+	return
+}

--
Gitblit v1.8.0