zhangqian
2024-08-01 35d641adccfd2aa2bcd0090415ff7fdb18e9773d
库存报表多单位数据查询修正
2个文件已修改
78 ■■■■ 已修改文件
service/inventory_report_forms.go 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/more_units.go 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/inventory_report_forms.go
@@ -1,6 +1,7 @@
package service
import (
    "encoding/json"
    "fmt"
    "github.com/shopspring/decimal"
    "github.com/xuri/excelize/v2"
@@ -16,7 +17,8 @@
    ProductId string                   `json:"productId"`
    Amount    decimal.Decimal          `json:"amount"`
    Status    constvar.OperationStatus `json:"status"`
    //ProductName string                   `json:"productName"`
    MoreUnitValue string                   `json:"-" gorm:"type:varchar(255);comment:多单位值"`
    MoreUnitList  []models.UnitItems       `json:"moreUnitList" gorm:"-"`
}
type InventoryReportFormsService struct{}
@@ -55,12 +57,12 @@
    var inHouse []Detail
    var outHouse []Detail
    dbIn := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
        Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status").
        Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status, more_unit_value").
        Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id").
        Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeIncoming, constvar.BaseOperationTypeInternal}).
        Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Finish})
    dbOut := models.NewOperationDetailsSearch().Orm.Model(&models.OperationDetails{}).
        Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status").
        Select("wms_operation_details.product_id,wms_operation_details.amount,wms_operation.status as status, more_unit_value").
        Joins("left join wms_operation ON wms_operation_details.operation_id=wms_operation.id").
        Where("wms_operation.base_operation_type in (?)", []constvar.BaseOperationType{constvar.BaseOperationTypeOutgoing, constvar.BaseOperationTypeInternal, constvar.BaseOperationTypeDisuse}).
        Where("wms_operation.status in (?)", []constvar.OperationStatus{constvar.OperationStatus_Ready, constvar.OperationStatus_Finish})
@@ -76,10 +78,34 @@
    if err != nil {
        return
    }
    for _, in := range inHouse {
        var arr []models.UnitItems
        if len(in.MoreUnitValue) != 0 {
            err := json.Unmarshal([]byte(in.MoreUnitValue), &arr)
            if err != nil {
                return nil, err
            }
            in.MoreUnitList = arr
        }
    }
    err = dbOut.Find(&outHouse).Error
    if err != nil {
        return
    }
    for _, out := range outHouse {
        var arr []models.UnitItems
        if len(out.MoreUnitValue) != 0 {
            err := json.Unmarshal([]byte(out.MoreUnitValue), &arr)
            if err != nil {
                return nil, err
            }
            out.MoreUnitList = arr
        }
    }
    for _, material := range materials {
        data := new(response.InventoryForms)
        data.ProduceId = material.ID
@@ -93,31 +119,30 @@
        for _, amount := range productAmounts {
            if material.ID == amount.ProductId {
                data.Amount = data.Amount.Add(amount.Amount)
                data.AmountMoreUnits = AddMoreUnit(data.AmountMoreUnits, amount.MoreUnitList)
            }
        }
        for _, details := range inHouse {
            if material.ID == details.ProductId {
                data.In = data.In.Add(details.Amount)
                data.InMoreUnits = AddMoreUnit(data.InMoreUnits, details.MoreUnitList)
            }
        }
        available := decimal.NewFromInt(0)
        readyOutAmount := decimal.NewFromInt(0)
        readyOutAmountMoreUnitList := make([]models.UnitItems, 0)
        for _, details := range outHouse {
            if material.ID == details.ProductId {
                if details.Status == constvar.OperationStatus_Ready {
                    available = available.Add(details.Amount)
                    readyOutAmount = readyOutAmount.Add(details.Amount)
                    readyOutAmountMoreUnitList = AddMoreUnit(readyOutAmountMoreUnitList, details.MoreUnitList)
                } else {
                    data.Out = data.Out.Add(details.Amount)
                    data.OutMoreUnits = AddMoreUnit(data.OutMoreUnits, details.MoreUnitList)
                }
            }
        }
        data.AvailableNumber = data.Amount.Sub(available)
        if *material.MoreUnit {
            data.AmountMoreUnits = CreateMoreUnit(data.Amount, material.MoreUnitList)
            data.AvailableNumberMoreUnits = CreateMoreUnit(data.AvailableNumber, material.MoreUnitList)
            data.InMoreUnits = CreateMoreUnit(data.In, material.MoreUnitList)
            data.OutMoreUnits = CreateMoreUnit(data.Out, material.MoreUnitList)
        }
        data.AvailableNumber = data.Amount.Sub(readyOutAmount)                                        //可用数量等于库存数量减待出库数量
        data.AvailableNumberMoreUnits = SubMoreUnit(data.AmountMoreUnits, readyOutAmountMoreUnitList) //可用多单位等于剩余数量减待出库数量
        result = append(result, data)
    }
service/more_units.go
@@ -24,18 +24,29 @@
}
func AddMoreUnit(units []models.UnitItems, units2 []models.UnitItems) []models.UnitItems {
    moreValueArr := make([]models.UnitItems, 0, len(units))
    for _, unitItem1 := range units {
    unitMap := make(map[string]models.UnitItems)
    // 将 units 中的所有元素添加到 map 中
    for _, unitItem := range units {
        unitMap[unitItem.Unit] = unitItem
    }
    // 遍历 units2,合并相同单位的数量,并将 units2 中不存在于 units 中的单位添加到 map 中
        for _, unitItem2 := range units2 {
            if unitItem1.Unit == unitItem2.Unit {
                moreValueArr = append(moreValueArr, models.UnitItems{
                    Amount:   unitItem1.Amount.Add(unitItem2.Amount),
                    Unit:     unitItem1.Unit,
                    Floating: unitItem1.Floating,
                })
        if unitItem1, exists := unitMap[unitItem2.Unit]; exists {
            unitItem1.Amount = unitItem1.Amount.Add(unitItem2.Amount)
            unitMap[unitItem2.Unit] = unitItem1
        } else {
            unitMap[unitItem2.Unit] = unitItem2
            }
        }
    // 将 map 转换回 slice
    moreValueArr := make([]models.UnitItems, 0, len(unitMap))
    for _, unitItem := range unitMap {
        moreValueArr = append(moreValueArr, unitItem)
    }
    return moreValueArr
}