From 2033896d4335c27bd25e81f61a7c660468dc116a Mon Sep 17 00:00:00 2001 From: chenlin Date: Thu, 15 Aug 2024 11:50:53 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E8=BF=9B=E9=94=80=E5=AD=98?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=AD=97=E6=AE=B5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- app/admin/models/commodity.go | 4 +- app/admin/models/decision.go | 517 +++++++++++++++------------ app/admin/models/inventory_change.go | 10 +- app/admin/models/purchase.go | 10 +- 5 files changed, 316 insertions(+), 228 deletions(-) diff --git a/.gitignore b/.gitignore index 16eca52..42d440f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea ./logs/* +./temp/* dev-go-admin -main.exe \ No newline at end of file +main.exe diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index 99d5453..cce1082 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -2794,7 +2794,9 @@ func SetStockCommodityState(c *gin.Context, id uint32) error { //更新库存状 // 更新商品库存详情表状态为:系统出库 if err := begin.Model(&ErpStockCommodity{}).Where("id=?", id).Updates(map[string]interface{}{ - "state": SystemOut}).Error; err != nil { + "state": SystemOut, + "updated_at": time.Now(), + }).Error; err != nil { return fmt.Errorf("[update err]:%v", err) } diff --git a/app/admin/models/decision.go b/app/admin/models/decision.go index b912dc1..34594de 100644 --- a/app/admin/models/decision.go +++ b/app/admin/models/decision.go @@ -50,6 +50,7 @@ type DecisionSumData struct { TotalAllotOut uint32 `json:"total_allot_out"` // 调拨出库 TotalAllotWaitOut uint32 `json:"total_allot_wait_out"` // 在途库存(出库) TotalProductIn uint32 `json:"total_product_in"` // 产品入库 + TotalSystemIn uint32 `json:"total_system_in"` // 系统入库 TotalSystemOut uint32 `json:"total_system_out"` // 系统出库 TotalCheckIn uint32 `json:"total_check_in"` // 盘点入库 TotalCheckOut uint32 `json:"total_check_out"` // 盘点出库 @@ -75,6 +76,7 @@ type DecisionReportData struct { AllotOut uint32 `json:"allot_out"` // 调拨出库 AllotWaitOut uint32 `json:"allot_wait_out"` // 在途库存(出库) ProductIn uint32 `json:"product_in"` // 产品入库 + SystemIn uint32 `json:"system_in"` // 系统入库 SystemOut uint32 `json:"system_out"` // 系统出库 CheckIn uint32 `json:"check_in"` // 盘点入库 CheckOut uint32 `json:"check_out"` // 盘点出库 @@ -222,71 +224,6 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR go func(item ErpStock) { defer wg.Done() - //var reportData DecisionReportData - //reportData.CommodityId = item.ErpCommodityId - //reportData.CommodityName = item.ErpCommodityName - //reportData.CommoditySerialNumber = item.CommoditySerialNumber - //reportData.CategoryID = item.ErpCategoryId - //reportData.CategoryName = item.ErpCategoryName - // - //// 查询期初库存、期初金额 - //systemStartData, _ := getSystemStartCount(m, item) - //reportData.BeginStock = systemStartData.BeginStock - //reportData.BeginAmount = systemStartData.BeginAmount - // - //// 查询采购进货数量 - //purchaseStockData, _ := getPurchaseStockCount(m, item) - //reportData.PurchaseStock = purchaseStockData.PurchaseStock - // - //// 查询采购退货数量 - //purchaseReturnData, _ := getPurchaseReturnCount(m, item) - //reportData.PurchaseReturn = purchaseReturnData.PurchaseReturn - // - //// 查询零售销售数量 - //saleOutData, _ := getSaleOutCount(m, item) - //reportData.OrderSale = saleOutData.OrderSale - // - //// 查询零售退货数量 - //saleReturnData, _ := getSaleReturnCount(m, item) - //reportData.OrderReject = saleReturnData.OrderReject - // - //// 查询调拨入库数量 - //allotInData, _ := getAllotInCount(m, item) - //reportData.AllotIn = allotInData.AllotIn - // - //// 查询在途库存(入库)数量 - //allotWaitInData, _ := getAllotWaitInCount(m, item) - //reportData.AllotWaitIn = allotWaitInData.AllotWaitIn - // - //// 查询调拨出库数量 - //allotOutData, _ := getAllotOutCount(m, item) - //reportData.AllotOut = allotOutData.AllotOut - // - //// 查询在途库存(出库)数量 - //allotWaitOutData, _ := getAllotWaitOutCount(m, item) - //reportData.AllotWaitOut = allotWaitOutData.AllotWaitOut - // - //// 查询产品入库数量:产品入库 - //productData, _ := getProductCount(m, item) - //reportData.ProductIn = productData.ProductIn - // - //// 查询系统出库数据:系统出库 - //systemOutData, _ := getSystemOutCount(m, item) - //reportData.SystemOut = systemOutData.SystemOut - // - //// 查询盘点入库数量 - //changeAddData, _ := getChangeAddCount(m, item) - //reportData.CheckIn = changeAddData.CheckIn - // - //// 查询盘点出库数量 - //changeReduceData, _ := getChangeReduceCount(m, item) - //reportData.CheckOut = changeReduceData.CheckOut - // - //// 查询期末库存、期末金额 - //systemEndData, _ := getSystemEndCount(m, item) - //reportData.EndStock = systemEndData.EndStock - //reportData.EndAmount = systemEndData.EndAmount - reportData, _ := calculateInventoryReport(m, item) reportData.CommodityId = item.ErpCommodityId reportData.CommodityName = item.ErpCommodityName @@ -333,28 +270,9 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR } } - //var sumData DecisionSumData for _, data := range commodityMap { - //sumData.TotalBeginStock += data.BeginStock - //sumData.TotalBeginAmount += data.BeginAmount - //sumData.TotalPurchaseStock += data.PurchaseStock - //sumData.TotalPurchaseReturn += data.PurchaseReturn - //sumData.TotalOrderSale += data.OrderSale - //sumData.TotalOrderReject += data.OrderReject - //sumData.TotalAllotIn += data.AllotIn - //sumData.TotalAllotWaitIn += data.AllotWaitIn - //sumData.TotalAllotOut += data.AllotOut - //sumData.TotalAllotWaitOut += data.AllotWaitOut - //sumData.TotalProductIn += data.ProductIn - //sumData.TotalSystemOut += data.SystemOut - //sumData.TotalCheckIn += data.CheckIn - //sumData.TotalCheckOut += data.CheckOut - //sumData.TotalEndStock += data.EndStock - //sumData.TotalEndAmount += data.EndAmount - reportList = append(reportList, data) } - //resp.SumData = sumData // 排序规则:商品编号小 SortReportByDecisionCommodities(reportList) @@ -463,6 +381,12 @@ func calculateInventoryReport(m *ErpDecisionReportReq, item ErpStock) (DecisionR } reportData.ProductIn = productData.ProductIn + systemInData, err := getSystemInCount(m, item) + if err != nil { + return DecisionReportData{}, err + } + reportData.SystemIn = systemInData.SystemIn + systemOutData, err := getSystemOutCount(m, item) if err != nil { return DecisionReportData{}, err @@ -481,13 +405,18 @@ func calculateInventoryReport(m *ErpDecisionReportReq, item ErpStock) (DecisionR } reportData.CheckOut = changeReduceData.CheckOut - // Step 4: 计算调整库存逻辑(期初+入库-出库) - reportData.EndStock = reportData.BeginStock + reportData.PurchaseStock + reportData.AllotIn + reportData.ProductIn + reportData.CheckIn - if reportData.EndStock < (reportData.PurchaseReturn + reportData.OrderSale + reportData.AllotOut + reportData.SystemOut + reportData.CheckOut) { - reportData.EndStock = 0 - reportData.EndAmount = 0 - } else { - reportData.EndStock -= reportData.PurchaseReturn + reportData.OrderSale + reportData.AllotOut + reportData.SystemOut + reportData.CheckOut + if m.EndTime != "" { + // Step 4: 计算调整库存逻辑(期初+入库-出库) + reportData.EndStock = reportData.BeginStock + reportData.PurchaseStock + reportData.AllotIn + + reportData.ProductIn + reportData.CheckIn + reportData.OrderReject + reportData.SystemIn + if reportData.EndStock < (reportData.PurchaseReturn + reportData.OrderSale + reportData.AllotOut + + reportData.SystemOut + reportData.CheckOut) { + reportData.EndStock = 0 + reportData.EndAmount = 0 + } else { + reportData.EndStock -= reportData.PurchaseReturn + reportData.OrderSale + reportData.AllotOut + + reportData.SystemOut + reportData.CheckOut + } } return reportData, nil @@ -504,7 +433,9 @@ func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRep } // 计算开始时间的前一天 - previousDay := startTime.AddDate(0, 0, -1) + //previousDay := startTime.AddDate(0, 0, -1) + previousDay := startTime.AddDate(0, 0, -1).Truncate(24 * time.Hour). + Add(23*time.Hour + 59*time.Minute + 59*time.Second) // 获取系统入库数量 var systemStartData DecisionReportData @@ -528,15 +459,21 @@ func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRep // 获取开始时间前一天的所有出库数量(包括销售出库、系统出库和盘点出库) var outStockData struct { - SoldOut uint32 `json:"sold_out"` - SystemOut uint32 `json:"system_out"` - CheckOut uint32 `json:"check_out"` + SoldOut uint32 `json:"sold_out"` + SoldOutAmount float64 `json:"sold_out_amount"` + SystemOut uint32 `json:"system_out"` + SystemOutAmount float64 `json:"system_out_amount"` + CheckOut uint32 `json:"check_out"` + CheckOutAmount float64 `json:"check_out_amount"` } es := orm.Eloquent.Debug().Table("erp_stock_commodity"). Select("SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS sold_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS sold_out_amount, "+ "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, "+ - "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out", - SoldOut, SystemOut, CheckOut). + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS system_out_amount, "+ + "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS check_out_amount", + SoldOut, SoldOut, SystemOut, SystemOut, CheckOut, CheckOut). Where("updated_at <= ?", previousDay). Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut}). Where("erp_commodity_id = ?", stock.ErpCommodityId) @@ -556,15 +493,21 @@ func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRep // 获取开始时间前一天的所有入库数量(包括采购入库、产品入库和盘点入库) var inStockData struct { - PurchaseIn uint32 `json:"purchase_in"` - ProductIn uint32 `json:"product_in"` - CheckIn uint32 `json:"check_in"` + PurchaseIn uint32 `json:"purchase_in"` + PurchaseInAmount float64 `json:"purchase_in_amount"` + ProductIn uint32 `json:"product_in"` + ProductInAmount float64 `json:"product_in_amount"` + CheckIn uint32 `json:"check_in"` + CheckInAmount float64 `json:"check_in_amount"` } ts := orm.Eloquent.Debug().Table("erp_stock_commodity"). Select("SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS purchase_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS purchase_in_amount, "+ "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, "+ - "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in", - PurchaseInventory, ProductInventory, CheckInventory). + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS product_in_amount, "+ + "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS check_in_amount", + PurchaseInventory, PurchaseInventory, ProductInventory, ProductInventory, CheckInventory, CheckInventory). Where("created_at <= ?", previousDay). Where("erp_commodity_id = ?", stock.ErpCommodityId) @@ -584,30 +527,38 @@ func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRep // 计算期初库存 beginStock := int64(systemStartData.BeginStock) - int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - int64(outStockData.CheckOut) + int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + int64(inStockData.CheckIn) - if beginStock < 0 { beginStock = 0 // 确保库存不会为负 } + + // 计算期初金额 + beginAmount := systemStartData.BeginAmount - outStockData.SoldOutAmount - + outStockData.SystemOutAmount - outStockData.CheckOutAmount + + inStockData.PurchaseInAmount + inStockData.ProductInAmount + inStockData.CheckInAmount + if beginAmount < 0 { + beginAmount = 0 // 确保库存不会为负 + } + reportData.BeginStock = uint32(beginStock) - reportData.BeginAmount = systemStartData.BeginAmount + reportData.BeginAmount = beginAmount } else { - // 如果没有开始时间,直接获取系统入库数量作为期初库存 - qs := orm.Eloquent.Debug().Table("erp_stock_commodity"). - Select("SUM(count) as begin_stock, SUM(wholesale_price) as begin_amount"). - Where("storage_type = ? and erp_commodity_id = ?", SystemInventory, stock.ErpCommodityId) - - if stock.StoreId != 0 { - if len(stock.DecisionStoreId) > 1 { - qs = qs.Where("store_id in (?)", stock.DecisionStoreId) - } else { - qs = qs.Where("store_id = ?", stock.DecisionStoreId) - } - } - err := qs.Find(&reportData).Error - if err != nil { - return DecisionReportData{}, err - } + //// 如果没有开始时间,直接获取系统入库数量作为期初库存 + //qs := orm.Eloquent.Debug().Table("erp_stock_commodity"). + // Select("SUM(count) as begin_stock, SUM(wholesale_price) as begin_amount"). + // Where("storage_type = ? and erp_commodity_id = ?", SystemInventory, stock.ErpCommodityId) + // + //if stock.StoreId != 0 { + // if len(stock.DecisionStoreId) > 1 { + // qs = qs.Where("store_id in (?)", stock.DecisionStoreId) + // } else { + // qs = qs.Where("store_id = ?", stock.DecisionStoreId) + // } + //} + //err := qs.Find(&reportData).Error + //if err != nil { + // return DecisionReportData{}, err + //} } return reportData, nil @@ -628,17 +579,27 @@ func getSystemEndCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor // 获取结束时间之前的所有入库数量(包括系统入库、采购入库、产品入库和盘点入库) var inStockData struct { - SystemIn uint32 `json:"system_in"` - PurchaseIn uint32 `json:"purchase_in"` - ProductIn uint32 `json:"product_in"` - CheckIn uint32 `json:"check_in"` + SystemIn uint32 `json:"system_in"` + SystemInAmount float64 `json:"system_in_amount"` + PurchaseIn uint32 `json:"purchase_in"` + PurchaseInAmount float64 `json:"purchase_in_amount"` + ProductIn uint32 `json:"product_in"` + ProductInAmount float64 `json:"product_in_amount"` + CheckIn uint32 `json:"check_in"` + CheckInAmount float64 `json:"check_in_amount"` } qs = qs.Select("SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS system_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS system_in_amount, "+ "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS purchase_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS purchase_in_amount, "+ "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, "+ - "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in", - SystemInventory, PurchaseInventory, ProductInventory, CheckInventory). - Where("updated_at <= ?", endTime) + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS product_in_amount, "+ + "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS check_in_amount", + SystemInventory, SystemInventory, PurchaseInventory, PurchaseInventory, ProductInventory, ProductInventory, + CheckInventory, CheckInventory). + Where("updated_at <= ?", endTime). + Where("erp_commodity_id = ?", stock.ErpCommodityId) if stock.StoreId != 0 { if len(stock.DecisionStoreId) > 1 { @@ -655,16 +616,23 @@ func getSystemEndCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor // 获取结束时间之前的所有出库数量(包括销售出库、系统出库和盘点出库) var outStockData struct { - SoldOut uint32 `json:"sold_out"` - SystemOut uint32 `json:"system_out"` - CheckOut uint32 `json:"check_out"` + SoldOut uint32 `json:"sold_out"` + SoldOutAmount float64 `json:"sold_out_amount"` + SystemOut uint32 `json:"system_out"` + SystemOutAmount float64 `json:"system_out_amount"` + CheckOut uint32 `json:"check_out"` + CheckOutAmount float64 `json:"check_out_amount"` } es = es.Select("SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS sold_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS sold_out_amount, "+ "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, "+ - "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out", - SoldOut, SystemOut, CheckOut). + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS system_out_amount, "+ + "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS check_out_amount", + SoldOut, SoldOut, SystemOut, SystemOut, CheckOut, CheckOut). Where("updated_at <= ?", endTime). - Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut}) + Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut}). + Where("erp_commodity_id = ?", stock.ErpCommodityId) if stock.StoreId != 0 { if len(stock.DecisionStoreId) > 1 { @@ -679,18 +647,29 @@ func getSystemEndCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor } // 计算期末库存 - endStock := int64(inStockData.SystemIn) + int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + int64(inStockData.CheckIn) - - int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - int64(outStockData.CheckOut) + endStock := int64(inStockData.SystemIn) + int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + + int64(inStockData.CheckIn) - int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - + int64(outStockData.CheckOut) if endStock < 0 { endStock = 0 // 确保库存不会为负 } - reportData.EndStock = uint32(endStock) + // 计算期末金额 + endAmount := inStockData.SystemInAmount + inStockData.PurchaseInAmount + inStockData.ProductInAmount + + inStockData.CheckInAmount - outStockData.SoldOutAmount - outStockData.SystemOutAmount - + outStockData.CheckOutAmount + if endAmount < 0 { + endAmount = 0 + } + + reportData.EndStock = uint32(endStock) + reportData.EndAmount = endAmount } else { - // 如果没有结束时间,直接获取系统入库数量作为期末库存 + // 如果没有结束时间,直接获取系统在库数量作为期末库存 qs = qs.Select("SUM(count) as end_stock, SUM(wholesale_price) as end_amount"). - Where("storage_type = ? and erp_commodity_id = ?", SystemInventory, stock.ErpCommodityId) + Where("state in (?) and erp_commodity_id = ?", []uint32{InStock, InAllot}, stock.ErpCommodityId). + Find(&reportData) if stock.StoreId != 0 { if len(stock.DecisionStoreId) > 1 { @@ -1194,6 +1173,51 @@ func getChangeReduceCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRe return reportData, nil } +// 查询系统入库数据:系统入库 +func getSystemInCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportData, error) { + var reportData DecisionReportData + + qs := orm.Eloquent.Debug().Table("erp_stock_commodity") + + // 进行条件查询 + if req.StartTime != "" { // 出入库开始时间 + parse, err := time.Parse(QueryTimeFormat, req.StartTime) + if err != nil { + logger.Errorf("getSystemStartCount err:", err) + return DecisionReportData{}, err + } + qs = qs.Where("created_at > ?", parse) + } + + if req.EndTime != "" { // 出入库结束时间 + parse, err := time.Parse(QueryTimeFormat, req.EndTime) + if err != nil { + logger.Errorf("getSystemStartCount err:", err) + return DecisionReportData{}, err + } + qs = qs.Where("created_at <= ?", parse) + } + + var err error + if stock.StoreId != 0 { + if len(stock.DecisionStoreId) > 1 { + err = qs.Select("SUM(count) as system_in").Where("storage_type = ? and store_id in (?) "+ + "and erp_commodity_id = ?", SystemInventory, stock.DecisionStoreId, stock.ErpCommodityId).Find(&reportData).Error + } else { + err = qs.Select("SUM(count) as system_in").Where("storage_type = ? and store_id = ? "+ + "and erp_commodity_id = ?", SystemInventory, stock.StoreId, stock.ErpCommodityId).Find(&reportData).Error + } + } else { + err = qs.Select("SUM(count) as system_in").Where("storage_type = ? "+ + "and erp_commodity_id = ?", SystemInventory, stock.ErpCommodityId).Find(&reportData).Error + } + if err != nil { + return DecisionReportData{}, err + } + + return reportData, nil +} + // 查询系统出库数据:系统出库 func getSystemOutCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportData, error) { var reportData DecisionReportData @@ -1476,7 +1500,9 @@ func getSumStartCount(req *ErpDecisionReportReq) (DecisionReportData, error) { } // 计算开始时间的前一天 - previousDay := startTime.AddDate(0, 0, -1) + //previousDay := startTime.AddDate(0, 0, -1) + previousDay := startTime.AddDate(0, 0, -1).Truncate(24 * time.Hour). + Add(23*time.Hour + 59*time.Minute + 59*time.Second) // 获取系统入库数量 var systemStartData DecisionReportData @@ -1487,29 +1513,41 @@ func getSumStartCount(req *ErpDecisionReportReq) (DecisionReportData, error) { // 获取开始时间前一天的所有出库数量(包括销售出库、系统出库和盘点出库) var outStockData struct { - SoldOut uint32 `json:"sold_out"` - SystemOut uint32 `json:"system_out"` - CheckOut uint32 `json:"check_out"` + SoldOut uint32 `json:"sold_out"` + SoldOutAmount float64 `json:"sold_out_amount"` + SystemOut uint32 `json:"system_out"` + SystemOutAmount float64 `json:"system_out_amount"` + CheckOut uint32 `json:"check_out"` + CheckOutAmount float64 `json:"check_out_amount"` } es := orm.Eloquent.Debug().Table("erp_stock_commodity"). Select("SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS sold_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS sold_out_amount, "+ "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, "+ - "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out", - SoldOut, SystemOut, CheckOut). + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS system_out_amount, "+ + "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS check_out_amount", + SoldOut, SoldOut, SystemOut, SystemOut, CheckOut, CheckOut). Where("updated_at <= ?", previousDay). Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut}) // 获取开始时间前一天的所有入库数量(包括采购入库、产品入库和盘点入库) var inStockData struct { - PurchaseIn uint32 `json:"purchase_in"` - ProductIn uint32 `json:"product_in"` - CheckIn uint32 `json:"check_in"` + PurchaseIn uint32 `json:"purchase_in"` + PurchaseInAmount float64 `json:"purchase_in_amount"` + ProductIn uint32 `json:"product_in"` + ProductInAmount float64 `json:"product_in_amount"` + CheckIn uint32 `json:"check_in"` + CheckInAmount float64 `json:"check_in_amount"` } ts := orm.Eloquent.Debug().Table("erp_stock_commodity"). Select("SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS purchase_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS purchase_in_amount, "+ "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, "+ - "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in", - PurchaseInventory, ProductInventory, CheckInventory). + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS product_in_amount, "+ + "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS check_in_amount", + PurchaseInventory, PurchaseInventory, ProductInventory, ProductInventory, CheckInventory, CheckInventory). Where("created_at <= ?", previousDay) if len(req.StoreId) > 0 { // 门店复选 @@ -1576,61 +1614,71 @@ func getSumStartCount(req *ErpDecisionReportReq) (DecisionReportData, error) { } // 计算期初库存 - beginStock := int64(systemStartData.BeginStock) - int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - int64(outStockData.CheckOut) + - int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + int64(inStockData.CheckIn) + beginStock := int64(systemStartData.BeginStock) - int64(outStockData.SoldOut) - int64(outStockData.SystemOut) - + int64(outStockData.CheckOut) + int64(inStockData.PurchaseIn) + int64(inStockData.ProductIn) + + int64(inStockData.CheckIn) if beginStock < 0 { beginStock = 0 // 确保库存不会为负 } + + // 计算期初金额 + beginAmount := systemStartData.BeginAmount - outStockData.SoldOutAmount - + outStockData.SystemOutAmount - outStockData.CheckOutAmount + + inStockData.PurchaseInAmount + inStockData.ProductInAmount + inStockData.CheckInAmount + if beginAmount < 0 { + beginAmount = 0 // 确保库存不会为负 + } + reportData.BeginStock = uint32(beginStock) - reportData.BeginAmount = systemStartData.BeginAmount + reportData.BeginAmount = beginAmount } else { - // 如果没有开始时间,直接获取系统入库数量作为期初库存 - qs := orm.Eloquent.Debug().Table("erp_stock_commodity"). - Select("SUM(count) as begin_stock, SUM(wholesale_price) as begin_amount"). - Where("storage_type = ?", SystemInventory) - - if len(req.StoreId) > 0 { // 门店复选 - var storeIDs []uint32 - for _, store := range req.StoreId { - storeIDs = append(storeIDs, store) - } - if len(storeIDs) == 1 { - qs = qs.Where("store_id IN = ?", storeIDs[0]) - } else { - qs = qs.Where("store_id IN (?)", storeIDs) - } - } - - if len(req.CommodityName) > 0 { // 商品名称 - var commodityNames []string - for _, commodityName := range req.CommodityName { - commodityNames = append(commodityNames, commodityName) - } - if len(commodityNames) == 1 { - qs = qs.Where("erp_commodity_name = ?", commodityNames[0]) - } else { - qs = qs.Where("erp_commodity_name IN (?)", commodityNames) - } - } - - if len(req.CategoryID) > 0 { // 商品分类id - var categoryIDs []uint32 - for _, category := range req.CategoryID { - categoryIDs = append(categoryIDs, category) - } - if len(categoryIDs) == 1 { - qs = qs.Where("erp_category_id = ?", categoryIDs[0]) - } else { - qs = qs.Where("erp_category_id IN (?)", categoryIDs) - } - } - - err := qs.Find(&reportData).Error - if err != nil { - return DecisionReportData{}, err - } + //// 如果没有开始时间,直接获取系统入库数量作为期初库存 + //qs := orm.Eloquent.Debug().Table("erp_stock_commodity"). + // Select("SUM(count) as begin_stock, SUM(wholesale_price) as begin_amount"). + // Where("storage_type = ?", SystemInventory) + // + //if len(req.StoreId) > 0 { // 门店复选 + // var storeIDs []uint32 + // for _, store := range req.StoreId { + // storeIDs = append(storeIDs, store) + // } + // if len(storeIDs) == 1 { + // qs = qs.Where("store_id IN = ?", storeIDs[0]) + // } else { + // qs = qs.Where("store_id IN (?)", storeIDs) + // } + //} + // + //if len(req.CommodityName) > 0 { // 商品名称 + // var commodityNames []string + // for _, commodityName := range req.CommodityName { + // commodityNames = append(commodityNames, commodityName) + // } + // if len(commodityNames) == 1 { + // qs = qs.Where("erp_commodity_name = ?", commodityNames[0]) + // } else { + // qs = qs.Where("erp_commodity_name IN (?)", commodityNames) + // } + //} + // + //if len(req.CategoryID) > 0 { // 商品分类id + // var categoryIDs []uint32 + // for _, category := range req.CategoryID { + // categoryIDs = append(categoryIDs, category) + // } + // if len(categoryIDs) == 1 { + // qs = qs.Where("erp_category_id = ?", categoryIDs[0]) + // } else { + // qs = qs.Where("erp_category_id IN (?)", categoryIDs) + // } + //} + // + //err := qs.Find(&reportData).Error + //if err != nil { + // return DecisionReportData{}, err + //} } return reportData, nil @@ -1694,16 +1742,25 @@ func getSumEndCount(req *ErpDecisionReportReq) (DecisionReportData, error) { // 获取结束时间之前的所有入库数量(包括系统入库、采购入库、产品入库和盘点入库) var inStockData struct { - SystemIn uint32 `json:"system_in"` - PurchaseIn uint32 `json:"purchase_in"` - ProductIn uint32 `json:"product_in"` - CheckIn uint32 `json:"check_in"` + SystemIn uint32 `json:"system_in"` + SystemInAmount float64 `json:"system_in_amount"` + PurchaseIn uint32 `json:"purchase_in"` + PurchaseInAmount float64 `json:"purchase_in_amount"` + ProductIn uint32 `json:"product_in"` + ProductInAmount float64 `json:"product_in_amount"` + CheckIn uint32 `json:"check_in"` + CheckInAmount float64 `json:"check_in_amount"` } qs = qs.Select("SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS system_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS system_in_amount, "+ "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS purchase_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS purchase_in_amount, "+ "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, "+ - "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in", - SystemInventory, PurchaseInventory, ProductInventory, CheckInventory). + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS product_in_amount, "+ + "SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS check_in, "+ + "SUM(CASE WHEN storage_type = ? THEN wholesale_price ELSE 0 END) AS check_in_amount", + SystemInventory, SystemInventory, PurchaseInventory, PurchaseInventory, ProductInventory, ProductInventory, + CheckInventory, CheckInventory). Where("updated_at <= ?", endTime) err = qs.Find(&inStockData).Error @@ -1713,14 +1770,20 @@ func getSumEndCount(req *ErpDecisionReportReq) (DecisionReportData, error) { // 获取结束时间之前的所有出库数量(包括销售出库、系统出库和盘点出库) var outStockData struct { - SoldOut uint32 `json:"sold_out"` - SystemOut uint32 `json:"system_out"` - CheckOut uint32 `json:"check_out"` + SoldOut uint32 `json:"sold_out"` + SoldOutAmount float64 `json:"sold_out_amount"` + SystemOut uint32 `json:"system_out"` + SystemOutAmount float64 `json:"system_out_amount"` + CheckOut uint32 `json:"check_out"` + CheckOutAmount float64 `json:"check_out_amount"` } es = es.Select("SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS sold_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS sold_out_amount, "+ "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, "+ - "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out", - SoldOut, SystemOut, CheckOut). + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS system_out_amount, "+ + "SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS check_out, "+ + "SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS check_out_amount", + SoldOut, SoldOut, SystemOut, SystemOut, CheckOut, CheckOut). Where("updated_at <= ?", endTime). Where("state IN (?)", []int{SoldOut, SystemOut, CheckOut}) @@ -1736,12 +1799,21 @@ func getSumEndCount(req *ErpDecisionReportReq) (DecisionReportData, error) { if endStock < 0 { endStock = 0 // 确保库存不会为负 } - reportData.EndStock = uint32(endStock) + // 计算期末金额 + endAmount := inStockData.SystemInAmount + inStockData.PurchaseInAmount + inStockData.ProductInAmount + + inStockData.CheckInAmount - outStockData.SoldOutAmount - outStockData.SystemOutAmount - + outStockData.CheckOutAmount + if endAmount < 0 { + endAmount = 0 + } + + reportData.EndStock = uint32(endStock) + reportData.EndAmount = endAmount } else { - // 如果没有结束时间,直接获取系统入库数量作为期末库存 + // 如果没有结束时间,直接获取系统在库数量作为期末库存 qs = qs.Select("SUM(count) as end_stock, SUM(wholesale_price) as end_amount"). - Where("storage_type = ?", SystemInventory) + Where("state in (?)", []uint32{InStock, InAllot}).Find(&reportData) err := qs.Find(&reportData).Error if err != nil { @@ -1752,7 +1824,7 @@ func getSumEndCount(req *ErpDecisionReportReq) (DecisionReportData, error) { return reportData, nil } -// 查询库存汇总数据:采购退货数量、产品入库、系统出库、在途库存(入库)数量 +// 查询库存汇总数据:采购退货数量、产品入库、系统入库、系统出库、在途库存(入库)数量 func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) { var reportData DecisionReportData qs := orm.Eloquent.Debug().Table("erp_stock_commodity") @@ -1810,9 +1882,10 @@ func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) { subQuery := qs.Select(` SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS purchase_return, SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS product_in, + SUM(CASE WHEN storage_type = ? THEN count ELSE 0 END) AS system_in, SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS system_out, SUM(CASE WHEN state = ? THEN count ELSE 0 END) AS allot_wait_in - `, PurchaseReturn, ProductInventory, SystemOut, InAllot) + `, PurchaseReturn, ProductInventory, SystemInventory, SystemOut, InAllot) err := subQuery.Scan(&reportData).Error if err != nil { @@ -2146,6 +2219,7 @@ func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error sumData.TotalPurchaseReturn = sumStockData.PurchaseReturn sumData.TotalAllotWaitIn = sumStockData.AllotWaitIn sumData.TotalProductIn = sumStockData.ProductIn + sumData.TotalSystemIn = sumStockData.SystemIn sumData.TotalSystemOut = sumStockData.SystemOut sumPurchaseData, err := getSumPurchaseData(req) @@ -2176,13 +2250,16 @@ func getSumDecisionReportData(req *ErpDecisionReportReq) (DecisionSumData, error sumData.TotalAllotIn = sumAllotData.AllotIn sumData.TotalAllotOut = sumAllotData.AllotOut - // Step 4: 计算调整库存逻辑(期初+入库-出库) - sumData.TotalEndStock = sumData.TotalBeginStock + sumData.TotalPurchaseStock + sumData.TotalAllotIn + sumData.TotalProductIn + sumData.TotalCheckIn - if sumData.TotalEndStock < (sumData.TotalPurchaseReturn + sumData.TotalOrderSale + sumData.TotalAllotOut + sumData.TotalSystemOut + sumData.TotalCheckOut) { - sumData.TotalEndStock = 0 - sumData.TotalEndAmount = 0 - } else { - sumData.TotalEndStock -= sumData.TotalPurchaseReturn + sumData.TotalOrderSale + sumData.TotalAllotOut + sumData.TotalSystemOut + sumData.TotalCheckOut + if req.EndTime != "" { + // Step 4: 计算调整库存逻辑(期初+入库-出库) + sumData.TotalEndStock = sumData.TotalBeginStock + sumData.TotalPurchaseStock + sumData.TotalAllotIn + + sumData.TotalProductIn + sumData.TotalCheckIn + sumData.TotalOrderReject + if sumData.TotalEndStock < (sumData.TotalPurchaseReturn + sumData.TotalOrderSale + sumData.TotalAllotOut + sumData.TotalSystemOut + sumData.TotalCheckOut) { + sumData.TotalEndStock = 0 + sumData.TotalEndAmount = 0 + } else { + sumData.TotalEndStock -= sumData.TotalPurchaseReturn + sumData.TotalOrderSale + sumData.TotalAllotOut + sumData.TotalSystemOut + sumData.TotalCheckOut + } } roundDecisionSumData(&sumData) diff --git a/app/admin/models/inventory_change.go b/app/admin/models/inventory_change.go index de656da..fbc7aa8 100644 --- a/app/admin/models/inventory_change.go +++ b/app/admin/models/inventory_change.go @@ -783,7 +783,10 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er // 更新库存商品状态为:盘点出库 err = gdb.Table("erp_stock_commodity").Where("imei = ?", trimCommodities[i].IMEI). - Updates(map[string]interface{}{"state": CheckOut}).Error + Updates(map[string]interface{}{ + "state": CheckOut, + "updated_at": time.Now(), + }).Error if err != nil { logger.Error("handleInventoryReduce update erp_stock_commodity err:", logger.Field("err", err)) @@ -836,7 +839,10 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er } err = gdb.Table("erp_stock_commodity").Where("id = ?", rightId). - Updates(map[string]interface{}{"state": CheckOut}).Error // 状态更新为:盘点出库 + Updates(map[string]interface{}{ + "state": CheckOut, + "updated_at": time.Now(), + }).Error // 状态更新为:盘点出库 if err != nil { logger.Error("handleInventoryReduce update erp_stock_commodity err:", logger.Field("err", err)) diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 5dcc5cd..ed40f06 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -1400,8 +1400,9 @@ func InventoryErpPurchaseUpdateRejectStock(gdb *gorm.DB, list []ErpPurchaseInven err = gdb.Table("erp_stock_commodity").Where("imei = ?", list[i].IMEI). Updates(&map[string]interface{}{ - "state": PurchaseReturn, - "stock_sn": list[i].SerialNumber, + "state": PurchaseReturn, + "stock_sn": list[i].SerialNumber, + "updated_at": time.Now(), }).Error // 状态更新为采购退货 if err != nil { logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) @@ -1462,8 +1463,9 @@ func InventoryErpPurchaseUpdateRejectStock(gdb *gorm.DB, list []ErpPurchaseInven return fmt.Errorf("商品[%s]采购退货数量超出实际库存数量,请先零售退货", list[i].ErpCommodityName) } err = gdb.Table("erp_stock_commodity").Where("id = ?", currentID).Updates(&map[string]interface{}{ - "state": PurchaseReturn, - "stock_sn": list[i].SerialNumber, + "state": PurchaseReturn, + "stock_sn": list[i].SerialNumber, + "updated_at": time.Now(), }).Error // 状态更新为采购退货 if err != nil { logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))