yinbentan
2024-07-06 79aef24a785581d95343ccd99e9cb362b2bc9c97
service/warehouse_month_forms.go
@@ -10,7 +10,6 @@
   "wms/models"
   "wms/pkg/logx"
   "wms/request"
   "wms/utils"
)
type WarehouseMonthFormsService struct{}
@@ -26,7 +25,8 @@
}
func (slf *WarehouseMonthFormsService) BuildSearch(params request.GetMonthStats) (search *models.WarehouseMonthStatsSearch) {
   search = models.NewWarehouseMonthStatsSearch().SetKeyword(params.Keyword).SetDate(params.Date)
   search = models.NewWarehouseMonthStatsSearch().
      SetKeyword(params.Keyword).SetDate(params.Date).SetWarehouseId(params.WarehouseID)
   if params.Preload {
      search = search.SetPreload(true)
   }
@@ -88,8 +88,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)
@@ -99,8 +99,8 @@
      f.SetCellValue("Sheet1", "E"+column, v.Unit)
      f.SetCellValue("Sheet1", "F"+column, v.SalePrice)
      slf.FillDealerTypeToExcel(v.InputItems, inputStart, i+3, inputTypes, f)
      slf.FillDealerTypeToExcel(v.OutputItems, outputStart, i+3, outputTypes, f)
      slf.FillDealerTypeToExcel(v.InputItems, inputStart, i+3, inputTypes, f, constvar.InputTotalHeader)
      slf.FillDealerTypeToExcel(v.OutputItems, outputStart, i+3, outputTypes, f, constvar.OutPutTotalHeader)
   }
   fileName := fmt.Sprintf("%s月度统计报表%s.xlsx", "仓库", time.Now().Format("2006-01-02-1504"))
@@ -139,16 +139,22 @@
   return sum
}
func (slf *WarehouseMonthFormsService) FillDealerTypeToExcel(items []*models.WarehouseStatsItems, startIndex int, column int, dealerTypes []string, f *excelize.File) {
func (slf *WarehouseMonthFormsService) FillDealerTypeToExcel(items []*models.WarehouseStatsItems, startIndex int, column int, dealerTypes []string, f *excelize.File, totalHeader string) {
   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
      if detailMap[dealerTypes[i]] != nil {
         amount = detailMap[dealerTypes[i]].Amount
      } else if dealerTypes[i] == constvar.InputTotalHeader {
      } else if dealerTypes[i] == totalHeader {
         amount = sum
      }
      f.SetCellValue("Sheet1", getColumnAlphabet(startIndex+i)+columnStr, amount)
@@ -156,7 +162,7 @@
   return
}
func GetCurrentWarehouseStats(date string, warehouseId int, productIds []string) (statRecords []*models.WarehouseMonthStats, err error) {
func GetCurrentWarehouseStats(date string, warehouseId int, productIds []string, realTime bool) (statRecords []*models.WarehouseMonthStats, err error) {
   //本月期初数量/上月结余数量
   groupSumList, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).GroupSum("product_id", "amount")
   productIds = make([]string, 0, len(groupSumList))
@@ -170,7 +176,16 @@
   }
   productMap := models.MaterialMap(products)
   beginTime, endTime := utils.GetLastMonthPeriod()
   //按配置取开始时间和结束时间
   beginTime, endTime, err := NewSystemConfigService().GetInventoryCutOffTime()
   if realTime {
      beginTime = endTime
      endTime = time.Now()
   }
   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 +214,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 +226,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 +260,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,
      })