From 37a64e6972df2b705670774047c65f9a0ce60ac1 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期三, 03 七月 2024 16:15:10 +0800
Subject: [PATCH] 月度统计定时任务按设定的时间查询相应数据&修复若干bug

---
 controllers/report_forms_controller.go |    1 
 task/warehouse_month_stats.go          |    3 +
 models/warehouse_month_stats.go        |   69 ++++++++++++++++++++--
 service/month_forms.go                 |    8 ++
 service/system_config.go               |   33 ++++++++++
 service/warehouse_month_forms.go       |   29 +++++++--
 6 files changed, 124 insertions(+), 19 deletions(-)

diff --git a/controllers/report_forms_controller.go b/controllers/report_forms_controller.go
index 1fdb840..a30a05d 100644
--- a/controllers/report_forms_controller.go
+++ b/controllers/report_forms_controller.go
@@ -551,6 +551,7 @@
 		return
 	}
 
+	params.Preload = true
 	monthFormsService := service.NewWarehouseMonthFormsService()
 	list, err := monthFormsService.FetchAll(params)
 	if err != nil {
diff --git a/models/warehouse_month_stats.go b/models/warehouse_month_stats.go
index d0c43d0..4a829e9 100644
--- a/models/warehouse_month_stats.go
+++ b/models/warehouse_month_stats.go
@@ -21,19 +21,20 @@
 		BeginAmount decimal.Decimal `json:"beginAmount" gorm:"type:decimal(30,10);not null;comment:鏁伴噺"` //鏈熷垵鏁伴噺
 		EndAmount   decimal.Decimal `json:"amount" gorm:"type:decimal(30,10);not null;comment:鏁伴噺"`      //鏈熸湯缁撲綑鏁伴噺
 
-		InputAmount decimal.Decimal        `json:"inputAmount" gorm:"type:decimal(30,10);not null;comment:鏁伴噺"` //鍏ュ簱鏁伴噺
-		InputItems  []*WarehouseStatsItems `json:"inputItems"`                                                 //鍏ュ簱鏄庣粏
-
+		InputAmount  decimal.Decimal        `json:"inputAmount" gorm:"type:decimal(30,10);not null;comment:鏁伴噺"` //鍏ュ簱鏁伴噺
+		InputItems   []*WarehouseStatsItems `json:"inputItems" gorm:"-"`                                        //鍏ュ簱鏄庣粏
+		Items        []*WarehouseStatsItems `json:"-"`
 		OutputAmount decimal.Decimal        `json:"outputAmount" gorm:"type:decimal(30,10);not null;comment:鏁伴噺"` //鍑哄簱鏁伴噺
-		OutputItems  []*WarehouseStatsItems `json:"outputItems"`                                                 //鍑哄簱鏄庣粏
+		OutputItems  []*WarehouseStatsItems `json:"outputItems"  gorm:"-"`                                       //鍑哄簱鏄庣粏
 
 		Date string `json:"date" gorm:"index;type:varchar(255); not null;default ''"` //鏃ユ湡 2024-04
 	}
 
 	WarehouseStatsItems struct {
-		WarehouseMonthStatsId int             `json:"warehouseMonthStatsId"`
-		Name                  string          `json:"name" gorm:"type:varchar(255);not null;default:''"` //鍏ュ簱鏉ユ簮锛屽嚭搴撳幓澶�
-		Amount                decimal.Decimal `json:"amount" gorm:"type:decimal(30,10);not null;"`       //鏁伴噺
+		WarehouseMonthStatsId int                 `json:"warehouseMonthStatsId"`
+		Type                  MonthStatsItemsType `json:"type" gorm:"type:tinyint;not null;default:1"`
+		Name                  string              `json:"name" gorm:"type:varchar(255);not null;default:''"` //鍏ュ簱鏉ユ簮锛屽嚭搴撳幓澶�
+		Amount                decimal.Decimal     `json:"amount" gorm:"type:decimal(30,10);not null;"`       //鏁伴噺
 	}
 
 	WarehouseMonthStatsSearch struct {
@@ -48,12 +49,64 @@
 	}
 )
 
+type MonthStatsItemsType int
+
+const (
+	MonthStatsItemsTypeInput  MonthStatsItemsType = 1 //鍏ュ簱
+	MonthStatsItemsTypeOutput MonthStatsItemsType = 2 //鍑哄簱
+)
+
 func (slf *WarehouseStatsItems) TableName() string {
 	return "wms_warehouse_month_stats_items"
 }
 
 func (slf *WarehouseMonthStats) TableName() string {
 	return "wms_warehouse_month_stats"
+}
+
+func (slf *WarehouseMonthStats) BeforeCreate(tx *gorm.DB) error {
+	if len(slf.InputItems) != 0 || len(slf.OutputItems) != 0 {
+		items := make([]*WarehouseStatsItems, 0, len(slf.InputItems)+len(slf.OutputItems))
+		for _, item := range slf.InputItems {
+			items = append(items, &WarehouseStatsItems{
+				Type:   MonthStatsItemsTypeInput,
+				Name:   item.Name,
+				Amount: item.Amount,
+			})
+		}
+
+		for _, item := range slf.OutputItems {
+			items = append(items, &WarehouseStatsItems{
+				Type:   MonthStatsItemsTypeOutput,
+				Name:   item.Name,
+				Amount: item.Amount,
+			})
+		}
+
+		slf.Items = items
+	}
+
+	return nil
+}
+
+func (slf *WarehouseMonthStats) AfterFind(tx *gorm.DB) error {
+	if len(slf.Items) != 0 {
+		inputItems := make([]*WarehouseStatsItems, 0)
+		outputItems := make([]*WarehouseStatsItems, 0)
+		for _, v := range slf.Items {
+			item := WarehouseStatsItems{
+				Type:   v.Type,
+				Name:   v.Name,
+				Amount: v.Amount,
+			}
+			if v.Type == MonthStatsItemsTypeInput {
+				inputItems = append(inputItems, &item)
+			} else {
+				outputItems = append(outputItems, &item)
+			}
+		}
+	}
+	return nil
 }
 
 func NewWarehouseMonthStatsSearch() *WarehouseMonthStatsSearch {
@@ -144,7 +197,7 @@
 	}
 
 	if slf.Preload {
-		db = db.Preload("InputItems").Preload("OutputItems")
+		db = db.Preload("Items")
 	}
 
 	return db
diff --git a/service/month_forms.go b/service/month_forms.go
index aca3f1a..9f1aed5 100644
--- a/service/month_forms.go
+++ b/service/month_forms.go
@@ -11,7 +11,6 @@
 	"wms/models"
 	"wms/pkg/logx"
 	"wms/request"
-	"wms/utils"
 )
 
 type MonthFormsService struct{}
@@ -197,7 +196,12 @@
 	}
 	productMap := models.MaterialMap(products)
 
-	beginTime, endTime := utils.GetLastMonthPeriod()
+	//鎸夐厤缃彇寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+	beginTime, endTime, err := NewSystemConfigService().GetInventoryCutOffTime()
+	if err != nil {
+		logx.Errorf("MonthStats GetCurrentStats get GetInventoryCutOffTime err:%v", err)
+		return
+	}
 	inputMap, err := GetStatsByOperationType(beginTime, endTime, constvar.BaseOperationTypeIncoming)
 	if err != nil {
 		logx.Errorf("MonthStats GetStatsByOperationType input err:%v", err)
diff --git a/service/system_config.go b/service/system_config.go
index daab2d6..e11412e 100644
--- a/service/system_config.go
+++ b/service/system_config.go
@@ -2,6 +2,7 @@
 
 import (
 	"errors"
+	"fmt"
 	"github.com/spf13/cast"
 	"gorm.io/gorm"
 	"strings"
@@ -65,9 +66,37 @@
 
 func (slf SystemConfigService) GetInventoryCutOffPoint() (day int, timeStr string, err error) {
 	config, err := models.NewSystemConfigSearch().SetConfigType(constvar.SystemConfigTypeInventoryCutOffPoint).First()
-	if err != nil {
-		err = errors.New("搴撳瓨缁撶畻鏃堕棿鐐规湭閰嶇疆")
+	if err == gorm.ErrRecordNotFound {
+		config = &models.SystemConfig{
+			Val: "01-00:01",
+		}
+	}
+	if err != nil && err != gorm.ErrRecordNotFound {
 		return
 	}
 	return slf.CheckInventoryCutOffPoint(config.Val)
 }
+
+func (slf SystemConfigService) GetInventoryCutOffTime() (beginTime, endTime time.Time, err error) {
+	day, timeStr, err := slf.GetInventoryCutOffPoint()
+	// 鍋囪褰撳墠鏃堕棿
+	currentTime := time.Now()
+	// 瑙f瀽缁欏畾鐨勬椂闂村瓧绗︿覆涓� time 瀵硅薄
+	parsedTime, err := time.Parse("15:04", timeStr)
+	if err != nil {
+		fmt.Println("鏃堕棿瑙f瀽閿欒:", err)
+		return
+	}
+
+	// 鍒涘缓涓�涓棩鏈熸椂闂村璞★紝鍋囪鍦ㄥ綋鍓嶆湀鐨勭粰瀹氭棩鍜屾椂闂�
+	endTime = time.Date(currentTime.Year(), currentTime.Month(), day, parsedTime.Hour(), parsedTime.Minute(), 0, 0, currentTime.Location())
+
+	// 濡傛灉缁欏畾鐨勬棩鏈熸椂闂村湪褰撳墠鏃堕棿涔嬪悗锛屾垜浠渶瑕佸洖鍒颁笂涓湀
+	if endTime.After(currentTime) {
+		lastMonth := currentTime.AddDate(0, -1, 0)
+		endTime = time.Date(lastMonth.Year(), lastMonth.Month(), day, parsedTime.Hour(), parsedTime.Minute(), 0, 0, currentTime.Location())
+	}
+	lastMonth := endTime.AddDate(0, -1, 0)
+	beginTime = time.Date(lastMonth.Year(), lastMonth.Month(), day, parsedTime.Hour(), parsedTime.Minute(), 0, 0, currentTime.Location())
+	return beginTime, endTime, nil
+}
diff --git a/service/warehouse_month_forms.go b/service/warehouse_month_forms.go
index a4d4838..3a60cd3 100644
--- a/service/warehouse_month_forms.go
+++ b/service/warehouse_month_forms.go
@@ -10,7 +10,6 @@
 	"wms/models"
 	"wms/pkg/logx"
 	"wms/request"
-	"wms/utils"
 )
 
 type WarehouseMonthFormsService struct{}
@@ -88,8 +87,8 @@
 	f.SetColWidth("Sheet1", "A", "F", 30)
 	f.SetColWidth("Sheet1", "G", getColumnAlphabet(headerLen), 15)
 
-	inputStart := 7
-	outputStart := 7 + len(inputTypes)
+	inputStart := 6
+	outputStart := 6 + len(inputTypes)
 	for i, v := range dataList {
 		column := strconv.Itoa(i + 3)
 		f.SetCellValue("Sheet1", "A"+column, v.ProductId)
@@ -143,6 +142,12 @@
 	columnStr := strconv.Itoa(column)
 	sum := slf.SumItems(items)
 	detailMap := models.WarehouseStatsItemMap(items)
+	for k := range detailMap {
+		if k == "" {
+			detailMap["鍏朵粬"] = detailMap[k]
+			delete(detailMap, k)
+		}
+	}
 
 	for i := 0; i < len(dealerTypes); i++ {
 		var amount decimal.Decimal
@@ -170,7 +175,12 @@
 	}
 	productMap := models.MaterialMap(products)
 
-	beginTime, endTime := utils.GetLastMonthPeriod()
+	//鎸夐厤缃彇寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+	beginTime, endTime, err := NewSystemConfigService().GetInventoryCutOffTime()
+	if err != nil {
+		logx.Errorf("MonthStats GetCurrentStats get GetInventoryCutOffTime err:%v", err)
+		return
+	}
 	inputMap, err := GetStatsMulti(beginTime, endTime, constvar.BaseOperationTypeIncoming, warehouseId)
 	if err != nil {
 		logx.Errorf("MonthStats GetStatsByOperationType input err:%v", err)
@@ -199,9 +209,9 @@
 			SalePrice:    product.SalePrice,
 			EndAmount:    amount,
 			InputAmount:  SumMapAmount(inputMap[productId]),
-			InputItems:   GetDealerItems(inputMap[productId]),
+			InputItems:   GetDealerItems(inputMap[productId], models.MonthStatsItemsTypeInput),
 			OutputAmount: SumMapAmount(outputMap[productId]),
-			OutputItems:  GetDealerItems(outputMap[productId]),
+			OutputItems:  GetDealerItems(outputMap[productId], models.MonthStatsItemsTypeOutput),
 			Date:         date,
 		}
 		statRecords = append(statRecords, &record)
@@ -211,11 +221,15 @@
 }
 
 func GetStatsMulti(beginTime, endTime time.Time, operationType constvar.BaseOperationType, warehouseId int) (m map[string]map[string]decimal.Decimal, err error) {
+	m = make(map[string]map[string]decimal.Decimal)
 	operationIds, err := models.NewOperationSearch().SetBaseOperationType(operationType).
 		SetFields("id").SetTimeBetween(beginTime, endTime).
 		SetWarehouseId(warehouseId).
 		FindIds()
 	if err != nil {
+		return
+	}
+	if len(operationIds) == 0 {
 		return
 	}
 	groupSumList, err := models.NewOperationDetailsSearch().SetOperationIds(operationIds).
@@ -241,13 +255,14 @@
 	return
 }
 
-func GetDealerItems(m map[string]decimal.Decimal) (items []*models.WarehouseStatsItems) {
+func GetDealerItems(m map[string]decimal.Decimal, tp models.MonthStatsItemsType) (items []*models.WarehouseStatsItems) {
 	for k, v := range m {
 		name := k
 		if name == "" {
 			name = "鍏朵粬"
 		}
 		items = append(items, &models.WarehouseStatsItems{
+			Type:   tp,
 			Name:   name,
 			Amount: v,
 		})
diff --git a/task/warehouse_month_stats.go b/task/warehouse_month_stats.go
index d811a3f..ed764ab 100644
--- a/task/warehouse_month_stats.go
+++ b/task/warehouse_month_stats.go
@@ -62,6 +62,9 @@
 		}
 
 		for _, record := range statsRecords {
+			if len(record.InputItems) == 0 {
+				continue
+			}
 			record.BeginAmount = record.EndAmount
 			err = models.WithTransaction(func(db *gorm.DB) error {
 				err = models.NewWarehouseMonthStatsSearch().SetOrm(db).Create(record)

--
Gitblit v1.8.0