zhangqian
2024-08-01 fc3313955a083c9480e4ea74398f72f9ba6addcd
月度统计查询多单位数据计算改查询。
3个文件已修改
82 ■■■■ 已修改文件
models/location_product_amount.go 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/operation_details.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/month_forms.go 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/location_product_amount.go
@@ -334,6 +334,19 @@
    return records, nil
}
func (slf *LocationProductAmountSearch) FindAll() ([]*LocationProductAmount, error) {
    var (
        records = make([]*LocationProductAmount, 0)
        db      = slf.build()
    )
    if err := db.Find(&records).Error; err != nil {
        return records, fmt.Errorf("find records err: %v", err)
    }
    return records, nil
}
func (slf *LocationProductAmountSearch) FirstRes() (*LocationProductAmount, *gorm.DB) {
    var (
        record = new(LocationProductAmount)
models/operation_details.go
@@ -55,6 +55,7 @@
        Preload      bool
        OperationIDs []int
        Fields       string
        ProductIds   []string
    }
)
@@ -147,6 +148,11 @@
    return slf
}
func (slf *OperationDetailsSearch) SetProductIds(productIds []string) *OperationDetailsSearch {
    slf.ProductIds = productIds
    return slf
}
func (slf *OperationDetailsSearch) SetBaseOperationType(baseOperationType constvar.BaseOperationType) *OperationDetailsSearch {
    slf.BaseOperationType = baseOperationType
    return slf
@@ -189,6 +195,10 @@
        db = db.Where("base_operation_type = ?", slf.BaseOperationType)
    }
    if len(slf.ProductIds) > 0 {
        db = db.Where("product_id in ?", slf.ProductIds)
    }
    return db
}
service/month_forms.go
@@ -145,17 +145,19 @@
        logx.Errorf("MonthStats GetCurrentStats get GetInventoryCutOffTime err:%v", err)
        return
    }
    inputMap, err := GetStatsByOperationType(beginTime, endTime, constvar.BaseOperationTypeIncoming)
    inputMap, inputProductMoreUnit, err := GetStatsByOperationType(beginTime, endTime, productIds, constvar.BaseOperationTypeIncoming)
    if err != nil {
        logx.Errorf("MonthStats GetStatsByOperationType input err:%v", err)
        return
    }
    outputMap, err := GetStatsByOperationType(beginTime, endTime, constvar.BaseOperationTypeOutgoing)
    outputMap, outputProductMoreUnit, err := GetStatsByOperationType(beginTime, endTime, productIds, constvar.BaseOperationTypeOutgoing)
    if err != nil {
        logx.Errorf("MonthStats GetStatsByOperationType output err:%v", err)
        return
    }
    productMoreUnit, err := GetProductMoreUnitMap(productIds)
    for _, groupSum := range groupSumList {
        productId := groupSum.Class
@@ -182,14 +184,14 @@
            inputMoreValueArr := make([]models.UnitItems, 0, len(product.MoreUnitList))
            outputMoreValueArr := make([]models.UnitItems, 0, len(product.MoreUnitList))
            if !amount.IsZero() {
                moreValueArr = CreateMoreUnit(amount, product.MoreUnitList)
                moreValueArr = productMoreUnit[productId]
            }
            if !inputMap[productId].IsZero() {
                inputMoreValueArr = CreateMoreUnit(inputMap[productId], product.MoreUnitList)
                inputMoreValueArr = inputProductMoreUnit[productId]
            }
            if !outputMap[productId].IsZero() {
                outputMoreValueArr = CreateMoreUnit(outputMap[productId], product.MoreUnitList)
                outputMoreValueArr = outputProductMoreUnit[productId]
            }
            bys, _ := json.Marshal(moreValueArr)
            moreUnits = string(bys)
@@ -211,18 +213,55 @@
    return
}
func GetStatsByOperationType(beginTime, endTime time.Time, operationType constvar.BaseOperationType) (m map[string]decimal.Decimal, err error) {
func GetStatsByOperationType(beginTime, endTime time.Time, productIds []string, operationType constvar.BaseOperationType) (m map[string]decimal.Decimal, productMoreUnit map[string][]models.UnitItems, err error) {
    operationIds, err := models.NewOperationSearch().SetBaseOperationType(operationType).SetFields("id").SetTimeBetween(beginTime, endTime).FindIds()
    if err != nil {
        return
    }
    groupSumList, err := models.NewOperationDetailsSearch().SetOperationIds(operationIds).SetFields("product_id, amount").GroupSum("product_id", "amount")
    productMoreUnit = make(map[string][]models.UnitItems)
    detailProducts, err := models.NewOperationDetailsSearch().
        SetProductIds(productIds).SetOperationIds(operationIds).
        SetFields("product_id, amount, more_unit_value").FindAll()
    m = make(map[string]decimal.Decimal, 0)
    if err != nil {
        logx.Errorf("MonthStats GetMoreUnitRecords err:%v", err)
        return
    }
    m = make(map[string]decimal.Decimal, len(groupSumList))
    for _, v := range groupSumList {
        m[v.Class] = v.Sum
    for _, v := range detailProducts {
        m[v.ProductId] = m[v.ProductId].Add(v.Amount)
        if v.MoreUnitValue == "" {
            continue
        }
        if productMoreUnit[v.ProductId] == nil {
            productMoreUnit[v.ProductId] = v.MoreUnitList
            continue
        }
        productMoreUnit[v.ProductId] = AddMoreUnit(productMoreUnit[v.ProductId], v.MoreUnitList)
    }
    return
}
func GetProductMoreUnitMap(productIds []string) (m map[string][]models.UnitItems, err error) {
    m = make(map[string][]models.UnitItems)
    locAmountRecords, err := models.NewLocationProductAmountSearch().SetProductIds(productIds).
        SetFields("product_id, more_unit_value").FindAll()
    if err != nil {
        logx.Errorf("MonthStats GetMoreUnitRecords err:%v", err)
        return
    }
    for _, v := range locAmountRecords {
        if v.MoreUnitValue == "" {
            continue
        }
        if m[v.ProductId] == nil {
            m[v.ProductId] = v.MoreUnitList
            continue
        }
        m[v.ProductId] = AddMoreUnit(m[v.ProductId], v.MoreUnitList)
    }
    return
}