package task
|
|
import (
|
"fmt"
|
"gorm.io/gorm"
|
"time"
|
"wms/constvar"
|
"wms/models"
|
"wms/pkg/logx"
|
"wms/service"
|
)
|
|
func WarehouseMonthStats() (err error) {
|
//加锁,只需要一个进程运行此任务
|
var (
|
lockName = "WarehouseMonthStats"
|
serviceID = "wms"
|
)
|
err = models.NewLockSearch().AcquireLock(lockName, serviceID)
|
if err != nil {
|
logx.Errorf("WarehouseMonthStats AcquireLock err:%v", err)
|
return
|
}
|
defer func() {
|
if err != nil {
|
service.SendAlarm("月度统计执行失败", "报错: "+err.Error())
|
}
|
err = models.NewLockSearch().ReleaseLock(lockName, serviceID)
|
if err != nil {
|
logx.Errorf("WarehouseMonthStats ReleaseLock err:%v", err)
|
service.SendAlarm("月度统计执行成功解锁失败", err.Error())
|
}
|
}()
|
|
date := time.Now().Format("2006-01")
|
lastDate := time.Now().AddDate(0, -1, 0).Format("2006-01")
|
|
warehouses, err := models.NewWarehouseSearch().SetOpenMonthStats(constvar.BoolTypeTrue).FindNotTotal()
|
if len(warehouses) == 0 {
|
return
|
}
|
|
for _, warehouse := range warehouses {
|
warehouseId := warehouse.Id
|
oldRecords, err := models.NewWarehouseMonthStatsSearch().
|
SetDate(lastDate).SetWarehouseId(warehouseId).SetFields("id, product_id").FindNotTotal()
|
if err != nil {
|
logx.Errorf("WarehouseMonthStats get last date record err:%v", err)
|
continue
|
}
|
oldRecordsMap := models.WarehouseMonthStatsMap(oldRecords)
|
|
//本月期初数量/上月结余数量
|
statsRecords, err := service.GetCurrentWarehouseStats(date, warehouseId, nil, false)
|
if err != nil {
|
continue
|
}
|
|
err = models.NewWarehouseMonthStatsSearch().SetDate(date).Delete()
|
if err != nil {
|
continue
|
}
|
|
for _, record := range statsRecords {
|
record.BeginAmount = record.EndAmount
|
err = models.WithTransaction(func(db *gorm.DB) error {
|
err = models.NewWarehouseMonthStatsSearch().SetOrm(db).Create(record)
|
if err != nil {
|
logx.Errorf("NewWarehouseMonthStatsSearch Create err:%v, record: %+v", err, record)
|
service.SendAlarm("按仓库月度统计创建本月失败", fmt.Sprintf("NewWarehouseMonthStatsSearch Create err:%v, record: %+v", err, record))
|
}
|
|
if oldRecordsMap[record.ProductId] != nil && oldRecordsMap[record.ProductId].Id != 0 {
|
oldRecordsMap[record.ProductId].EndAmount = record.EndAmount
|
if !record.InputAmount.IsZero() || !record.InputAmount.IsZero() {
|
oldRecordsMap[record.ProductId].InputAmount = record.InputAmount
|
oldRecordsMap[record.ProductId].InputItems = record.InputItems
|
oldRecordsMap[record.ProductId].OutputAmount = record.OutputAmount
|
oldRecordsMap[record.ProductId].OutputItems = record.OutputItems
|
}
|
err = models.NewWarehouseMonthStatsSearch().SetOrm(db).SetID(oldRecordsMap[record.ProductId].Id).Save(record)
|
if err != nil {
|
logx.Errorf("NewWarehouseMonthStatsSearch Save err:%v, record:%v", err, oldRecordsMap[record.ProductId])
|
service.SendAlarm("月度统计更改上月失败", fmt.Sprintf("NewWarehouseMonthStatsSearch Create err:%v, record: %+v", err, record))
|
}
|
}
|
return nil
|
})
|
}
|
}
|
if err == nil {
|
//service.SendAlarm("按仓库月度统计执行成功", "")
|
}
|
|
return
|
}
|