package service
|
|
import (
|
"github.com/shopspring/decimal"
|
"time"
|
"wms/constvar"
|
"wms/models"
|
"wms/pkg/logx"
|
"wms/request"
|
"wms/utils"
|
)
|
|
type WarehouseMonthFormsService struct{}
|
|
func NewWarehouseMonthFormsService() *WarehouseMonthFormsService {
|
return &WarehouseMonthFormsService{}
|
}
|
|
func (slf *WarehouseMonthFormsService) Query(params request.GetMonthStats) (result []*models.WarehouseMonthStats, err error) {
|
search := slf.BuildSearch(params)
|
search = search.SetPage(params.Page, params.PageSize)
|
return search.FindNotTotal()
|
}
|
|
func (slf *WarehouseMonthFormsService) BuildSearch(params request.GetMonthStats) (search *models.WarehouseMonthStatsSearch) {
|
search = models.NewWarehouseMonthStatsSearch().SetKeyword(params.Keyword).SetDate(params.Date)
|
if params.Preload {
|
search = search.SetPreload(true)
|
}
|
return search
|
}
|
|
func (slf *WarehouseMonthFormsService) Count(params request.GetMonthStats) (total int64, err error) {
|
search := slf.BuildSearch(params)
|
return search.Count()
|
}
|
|
func (slf *WarehouseMonthFormsService) FetchAll(params request.GetMonthStats) (list []*models.WarehouseMonthStats, err error) {
|
total, err := slf.Count(params)
|
if err != nil {
|
return nil, err
|
}
|
list = make([]*models.WarehouseMonthStats, 0, total)
|
params.PageSize = 500
|
page := 1
|
for {
|
params.Page = page
|
data, err := slf.Query(params)
|
if err != nil {
|
return nil, err
|
}
|
if len(data) == 0 {
|
break
|
}
|
list = append(list, data...)
|
page++
|
}
|
return
|
}
|
|
func GetCurrentWarehouseStats(date string, warehouseId int, productIds []string) (statRecords []*models.WarehouseMonthStats, err error) {
|
//本月期初数量/上月结余数量
|
groupSumList, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).GroupSum("product_id", "amount")
|
productIds = make([]string, 0, len(groupSumList))
|
for _, groupSum := range groupSumList {
|
productIds = append(productIds, groupSum.Class)
|
}
|
products, err := models.NewMaterialSearch().SetFields("id, name, unit, weight, more_unit, more_unit_value").SetIDs(productIds).FindNotTotal()
|
if err != nil {
|
logx.Errorf("MonthStats GetCurrentStats get products err:%v", err)
|
return
|
}
|
productMap := models.MaterialMap(products)
|
|
beginTime, endTime := utils.GetLastMonthPeriod()
|
inputMap, err := GetStatsMulti(beginTime, endTime, constvar.BaseOperationTypeIncoming, warehouseId)
|
if err != nil {
|
logx.Errorf("MonthStats GetStatsByOperationType input err:%v", err)
|
return
|
}
|
|
outputMap, err := GetStatsMulti(beginTime, endTime, constvar.BaseOperationTypeOutgoing, warehouseId)
|
if err != nil {
|
logx.Errorf("MonthStats GetStatsByOperationType output err:%v", err)
|
return
|
}
|
|
for _, groupSum := range groupSumList {
|
productId := groupSum.Class
|
if productMap[productId] == nil {
|
continue
|
}
|
product := productMap[productId]
|
|
amount := groupSum.Sum
|
record := models.WarehouseMonthStats{
|
WarehouseId: warehouseId,
|
ProductId: productId,
|
ProductName: product.Name,
|
Unit: product.Unit,
|
SalePrice: product.SalePrice,
|
EndAmount: amount,
|
InputAmount: SumMapAmount(inputMap[productId]),
|
InputItems: GetDealerItems(inputMap[productId]),
|
OutputAmount: SumMapAmount(outputMap[productId]),
|
OutputItems: GetDealerItems(outputMap[productId]),
|
Date: date,
|
}
|
statRecords = append(statRecords, &record)
|
}
|
|
return
|
}
|
|
func GetStatsMulti(beginTime, endTime time.Time, operationType constvar.BaseOperationType, warehouseId int) (m map[string]map[string]decimal.Decimal, err error) {
|
operationIds, err := models.NewOperationSearch().SetBaseOperationType(operationType).
|
SetFields("id").SetTimeBetween(beginTime, endTime).
|
SetWarehouseId(warehouseId).
|
FindIds()
|
if err != nil {
|
return
|
}
|
groupSumList, err := models.NewOperationDetailsSearch().SetOperationIds(operationIds).
|
SetFields("product_id, dealer_type, amount").
|
GroupMultiSumAmount()
|
if err != nil {
|
return
|
}
|
m = make(map[string]map[string]decimal.Decimal)
|
for _, v := range groupSumList {
|
if m[v.ProductID] == nil {
|
m[v.ProductID] = make(map[string]decimal.Decimal)
|
}
|
m[v.ProductID][v.DealerType] = v.Sum
|
}
|
return
|
}
|
|
func SumMapAmount(m map[string]decimal.Decimal) (sum decimal.Decimal) {
|
for _, v := range m {
|
sum = sum.Add(v)
|
}
|
return
|
}
|
|
func GetDealerItems(m map[string]decimal.Decimal) (items []*models.WarehouseStatsItems) {
|
for k, v := range m {
|
items = append(items, &models.WarehouseStatsItems{
|
Name: k,
|
Amount: v,
|
})
|
}
|
return
|
}
|