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